如果不在C#中返回值,我如何显示该方法成功或失败?
我知道在C/C++等其他语言中,您会返回SUCCESS这样的值,这将向调用方法指示该方法返回成功或失败 在C#中是否有一种“好”的方法可以做到这一点,而不需要一个成功的返回变量?我想到了抛出异常,但我不确定如何实现它。是否存在自定义异常,您可以将其与自己的错误消息一起抛出 样本代码将不胜感激如果不在C#中返回值,我如何显示该方法成功或失败?,c#,exception-handling,syntactic-sugar,C#,Exception Handling,Syntactic Sugar,我知道在C/C++等其他语言中,您会返回SUCCESS这样的值,这将向调用方法指示该方法返回成功或失败 在C#中是否有一种“好”的方法可以做到这一点,而不需要一个成功的返回变量?我想到了抛出异常,但我不确定如何实现它。是否存在自定义异常,您可以将其与自己的错误消息一起抛出 样本代码将不胜感激 提前谢谢。您指的是bool数据类型吗 函数定义示例: public static bool DoSomething() { if ( some || condition ) retu
提前谢谢。您指的是
bool
数据类型吗
函数定义示例:
public static bool DoSomething()
{
if ( some || condition )
return true;
else
return false;
}
用法示例:
public static void main()
{
if ( DoSomething() )
Console.WriteLine( "SUCCESS" );
else
Console.WriteLine( "FAILURE" );
}
听起来好像您想指出,如果不使用返回值或异常,方法无法成功完成。那么
out bool
参数呢
public void Execute(out bool success) {
try {
//...
success = true;
} catch {
success = false
}
}
我不建议这样做,但是由于您询问……如果您的方法是
void
,那么它返回时没有抛出异常的事实被认为是成功的
如果您的方法不是void,则特定的返回值可能被解释为执行不成功,例如:
方法返回bool
false
- 返回
null的任何引用类型返回方法
2) 为什么要避免返回值?必须没有返回值吗 我会想到不抛出异常 从函数中获取消息的基本方法有四种:
- 归还某物
- 使用out变量
- 抛出异常
- 将变量设置为类的另一个成员
如果出现意外错误,我会抛出异常。如果我希望某些东西不能一直工作,我会使用返回值。不要将异常用于流控制或指示“成功” 如果除了返回参数之外,还想有一个成功或失败的指示器,那么可以在方法签名中使用
out bool
参数
public SomeObject DoingSomethingHere(out bool success)
{
}
if (!success)
{
// some compensating action
}
对于某些类型的故障,自定义异常无疑是一个好方法。一种简单的方法是在一个公共库中创建一个
DomainException
类(或者您想为应用程序的问题域调用的任何类,等等),它继承自Exception
,并添加您认为对自定义域异常有用的任何特定信息。(可能是特定代码,可能是关于当前环境的信息,这些信息可能在标准例外情况中不可用,等等)
在此基础上,您可以创建从中继承的更具体的异常,如DataIntegrityException
,如果某个方法接收到的输入在技术层面上有意义,但违反了自定义业务验证规则,则可以抛出该异常。您可以从异常中派生自己的异常
您可以返回布尔值或某些数值约定
在C#中,如果要返回成功/失败,您有比指针更容易使用的输出参数,但也有产品输出
对于特殊的事情,我倾向于例外。对逻辑事物的逻辑返回。i、 e.不要使用异常来控制程序操作。如果文件操作意外失败,则引发异常。如果应用程序需要查找一个文件,并且通常预期在正常操作中有时找不到它,我不希望调用程序捕获异常,而是简单地返回布尔值并通过应用程序选择适当的逻辑路径。您可以返回一个状态变量,例如枚举、整数或布尔值。问题是调用方必须知道不同的返回值意味着什么。有时“真”意味着成功,有时意味着出错。而且,如果调用失败,直接调用方可能不知道该怎么办,需要失败“冒泡”,因为每个方法都失败了,因为它的调用失败了
Try-throw-catch是一种go-to模式,用于处理您知道可能失败的事情,并在发生以下情况时控制执行流:
public void MightFail()
{
//obviously your code will do something a little more meaningful
if(new Random().Next(2) == 0) throw new Exception("I failed");
return;
}
public void RunRiskyMethod()
{
var failures = 0;
var successes = 0;
var totalRuns = 0;
for(var i=1;i<10000;i++)
{
try
{
MightFail();
//if the previous line throws an exception, the below lines will not execute
successes++;
Console.WriteLine("Success!");
}
catch(Exception) //I didn't name the exception because we don't need its info.
{
//These lines ONLY execute if an exception was thrown from within the try block
failures++;
Console.WriteLine("Failure!");
}
finally
{
//this code ALWAYS executes, even if an exception is thrown and not caught
totalRuns++;
}
}
Console.WriteLine(String.Format("{0} Successes, {1} Failures.", successes, failures);
}
public void可能失败()
{
//显然,您的代码将做一些更有意义的事情
如果(new Random().Next(2)==0)抛出新异常(“I失败”);
返回;
}
public void RunRiskyMethod()
{
var故障=0;
var=0;
var totalRuns=0;
对于(var i=1;我认为你可能需要再复习一下基础知识。你在谷歌上搜索过“C#Custom Exception”了吗,看看你得到了什么?作为成功的指标,例外是一个糟糕的选择,但它们是异常情况(即意外失败)的极好指标.@Mark-当然。我并没有建议我们不应该使用异常。:)