Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 函数返回值c#_C# 4.0_Return Type - Fatal编程技术网

C# 4.0 函数返回值c#

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

我正在努力掌握C语言,因为我已经多年没有编写代码了,而且我以前在ANSI C中的工作经验也很丰富

我读过很多书,也在网上搜索过,但有一个方面是在逃避我,我希望这里有人能帮我

在过去,我会声明一个函数,如果函数中可能没有发生任何事情(例如,找不到文件等),则将返回值声明为整数。如果一切正常,我将返回0,如果不正常,则返回一个值。该值将对应于函数未能完全执行的位置,我可以从调用它的位置相应地进行分支

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())
无效,if
function
返回一个
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;
    }
}