函数返回值c#

时间:2012-12-12 12:15:15

标签: c#-4.0 return-type

我正在努力解决C#多年没有编码的问题以及我之前使用ANSI C的经验。

我已阅读了大量书籍并在网上搜索,但有一方面正在躲避我,我希望有人可以提供帮助。

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

if(function1())
  {
   // all my error stuff, maybe a switch/case etc.
  }

我在C#中找到的所有例子似乎都避免使用这种技术,我希望能在这里得到一些理解。

感谢您的期待。

(我知道我是化石)。 :)

4 个答案:

答案 0 :(得分:3)

例外是您在C#和类似语言中使用的方法。

它是这样的:

try
{
    function();
}
catch(FileNotFoundException e)
{
    // File not found
}
catch(UnauthorizedAccessException e)
{
    // User doesn't have right to access file
}
// etc...

为了完成这项工作,function不应返回状态代码,而是在出现错误时抛出异常。
请注意,如果您尝试访问文件并且其中一个错误发生,框架将抛出​​我在上面的代码块中说明的异常。所以你自己实际上不必这样做。


此外,在C#中没有从积分值到bool的隐式转换,即如果if(function())返回function,则int无效。你需要这样写:

if(function() != 0)
{
    // all your error stuff
}

答案 1 :(得分:2)

没有什么可以阻止你这样做(尽管有更好的方法来处理错误 - 例如exceptions。)

如果你想继续这种方法,你遇到的最大问题是在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)
{
}

这只是隐藏了其他潜在的问题。

答案 2 :(得分:1)

    if(function()==1)
     {

     }

    int function()
     {
      int returnVal =0;
      // do stuff
      // if true return  returnVal =1 else set returnVal =0;
      return  returnVal;
     }

答案 3 :(得分:1)

如果你想遵循检查返回值的模式而不是管理错误,你最好使用enumarations而不是普通数字。

例如:

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;
    }
}

在幕后,它仍在使用数字,但你对每个数字都有一些含义。