0

我正在努力掌握多年未编码的 C# 以及我以前在 ANSI C 方面的经验。

我读过很多书并在网上搜索过,但有一个方面正在逃避我,我希望这里有人能提供帮助。

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

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

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

感谢期待。

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

4

4 回答 4

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
}
于 2012-12-12T12:18:32.987 回答
2

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

如果您确实想继续使用这种方法,那么您遇到的最大问题是在 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)
{
}

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

于 2012-12-12T12:19:16.410 回答
1
    if(function()==1)
     {

     }

    int function()
     {
      int returnVal =0;
      // do stuff
      // if true return  returnVal =1 else set returnVal =0;
      return  returnVal;
     }
于 2012-12-12T12:19:14.347 回答
1

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

例如:

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

在幕后,它仍然使用数字,但你为每个数字赋予了一些意义。

于 2012-12-12T12:27:31.740 回答