当前位置:  开发笔记 > 编程语言 > 正文

执行所需的函数调用

如何解决《执行所需的函数调用》经验,为你挑选了2个好方法。

我在C#中有一个"Status"类,使用如下:

Status MyFunction()
{
   if(...) // something bad
     return new Status(false, "Something went wrong")
   else
     return new Status(true, "OK");
}

你明白了.MyFunction的所有调用者都应检查返回的状态:

Status myStatus = MyFunction();
if ( ! myStatus.IsOK() )
   // handle it, show a message,...

然而,懒惰的呼叫者可以忽略状态.

MyFunction(); // call function and ignore returned Status

要么

{
  Status myStatus = MyFunction(); 
} // lose all references to myStatus, without calling IsOK() on it

有可能使这不可能吗?例如抛出异常

一般来说:是否可以编写一个C#类,您必须在其上调用某个函数?

在Status类的C++版本中,我可以在析构函数中对某些私有bool bIsChecked编写测试,并在有人不检查此实例时响铃.

C#中的等价选项是什么?我在某处读到"你不想在你的C#类中使用析构函数"

IDisposable接口的Dispose方法是一个选项吗?

在这种情况下,没有非托管资源可供免费使用.此外,GC 不会确定何时处置该对象.当它最终被处置时,是否仍然可以知道忽略该特定Status实例的位置和时间?"using"关键字确实有帮助,但同样,懒惰的调用者不需要它.



1> Ian Nelson..:

我知道这不会直接回答你的问题,但是如果你的功能中出现"出问题"(意外情况),我认为你应该抛出异常而不是使用状态返回码.

然后将其留给调用者来捕获并处理此异常(如果可以),或者如果调用者无法处理该情况则允许它传播.

如果这是合适的,抛出的异常可以是自定义类型.

对于预期的替代结果,我同意@Jon Limjap的建议.我喜欢bool返回类型,并在方法名称前加上"Try",a la:

bool TryMyFunction(out Status status)
{
}



2> Jon Limjap..:

如果你真的想要求用户检索MyFunction的结果,你可能想要取消它而使用out或ref变量,例如,

void MyFunction(out Status status)
{
}

它可能看起来很丑陋,但至少它确保将一个变量传递给函数,该函数将获取您需要它获取的结果.

@Ian,

异常的问题在于,如果某些事情经常发生,您可能会为异常花费太多系统资源.真正的异常应该用于异常错误,而不是完全预期的消息.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有