C# 4.0 函数返回值c#
我正在努力掌握C语言,因为我已经多年没有编写代码了,而且我以前在ANSI C中的工作经验也很丰富 我读过很多书,也在网上搜索过,但有一个方面是在逃避我,我希望这里有人能帮我 在过去,我会声明一个函数,如果函数中可能没有发生任何事情(例如,找不到文件等),则将返回值声明为整数。如果一切正常,我将返回0,如果不正常,则返回一个值。该值将对应于函数未能完全执行的位置,我可以从调用它的位置相应地进行分支C# 4.0 函数返回值c#,c#-4.0,return-type,C# 4.0,Return Type,我正在努力掌握C语言,因为我已经多年没有编写代码了,而且我以前在ANSI C中的工作经验也很丰富 我读过很多书,也在网上搜索过,但有一个方面是在逃避我,我希望这里有人能帮我 在过去,我会声明一个函数,如果函数中可能没有发生任何事情(例如,找不到文件等),则将返回值声明为整数。如果一切正常,我将返回0,如果不正常,则返回一个值。该值将对应于函数未能完全执行的位置,我可以从调用它的位置相应地进行分支 if(function1()) { // all my error stuff, mayb
if(function1())
{
// all my error stuff, maybe a switch/case etc.
}
我在C#中找到的所有示例似乎都避免了这种技术,我希望在这里获得一些理解
谢谢你的期待
(我知道我是化石。):) 例外是您在C#和类似语言中使用的方法 事情是这样的:
try
{
function();
}
catch(FileNotFoundException e)
{
// File not found
}
catch(UnauthorizedAccessException e)
{
// User doesn't have right to access file
}
// etc...
要使此功能正常工作,函数不应返回状态代码,而应在出现错误时引发异常。
请注意,我在上面的代码块中说明的异常是由框架抛出的,如果您试图访问一个文件,并且其中一个错误正在发生。所以你实际上不必自己做这件事
此外,在C#中,没有从整数值到bool的隐式转换,即if(function())
无效,iffunction
返回一个int
。你需要这样写:
if(function() != 0)
{
// all your error stuff
}
没有什么可以阻止您这样做(尽管有更好的方法来处理错误,例如)
如果您确实想继续使用这种方法,那么您面临的最大问题是,在C#中,您不能将整数视为布尔值,因此您的If测试无法编译。您需要的是:
if (function1() != 0)
{
}
但要检查值,您需要:
int result = function1();
switch (result)
{
case 1:
// Handle this case
break;
case 2:
// Handle this case
break;
default:
// All OK
break;
}
最好为每个错误案例返回一个枚举类型,这样您就不会有幻数,但例外情况是最好的选择:
try
{
function1();
}
catch (SpecificException1 e1)
{
// Handle this case
}
catch (SpecificException2 e2)
{
// Handle this case
}
您不应该使用常规异常处理程序:
catch (Exception e)
{
}
这只是隐藏了其他潜在的问题。如果您想遵循检查返回值的模式而不是管理错误,那么最好使用枚举而不是普通数字
例如:
public enum ResultType
{
Error = 0,
Success,
Waiting
}
public ResultType function()
{
if (still_waiting)
return ResultType.Waiting;
if (error_has_occured)
return ResultType.Error;
return ResultType.Success;
}
public void Main()
{
ResultType result = function();
switch (result)
{
case ResultType.Success:
MessageBox.Show("all is good");
break;
case ResultType.Waiting:
MessageBox.Show("still waiting...");
break;
case ResultType.Error:
MessageBox.Show("error has occurred");
break;
}
}
在幕后,它仍然使用数字,但您为每个数字赋予了一些含义。请阅读更多信息。虽然在您描述的场景中,异常是一个很好的构造,但多年来,我看到了关于返回码与异常的几次辩论,因此,请注意,这不是一个必然的结论,您上面包含的片段决不是“错误的”。(好吧,除非其他海报说你需要与0进行比较,而不是虚假的等等)谢谢你,这很适合我。:)干杯,请记住,这不是现在使用C#等语言的最佳实践方式。很好地解释了异常的用法,这是首选的方法。:)谢谢你的建议。我希望我能把不止一个标记为有效答案。谢谢你的帮助。@Cimbian:不客气。请尝试阅读例外情况以及何时使用它们。可以。我想弄清楚“为什么”,而不仅仅是去做@Cimbian:这是一种很好的态度:-)哦!异常看起来非常有用,将节省大量代码和管理错误索引的需要。谢谢大家!:)
public enum ResultType
{
Error = 0,
Success,
Waiting
}
public ResultType function()
{
if (still_waiting)
return ResultType.Waiting;
if (error_has_occured)
return ResultType.Error;
return ResultType.Success;
}
public void Main()
{
ResultType result = function();
switch (result)
{
case ResultType.Success:
MessageBox.Show("all is good");
break;
case ResultType.Waiting:
MessageBox.Show("still waiting...");
break;
case ResultType.Error:
MessageBox.Show("error has occurred");
break;
}
}