0

私は何年もコーディングしていない C# と、ANSI C での以前の経験を理解しようとしています。

私はたくさんの本を読み、オンラインで検索しましたが、1つの側面が私を回避していて、ここの誰かが助けてくれることを願っています.

以前は、関数を宣言し、関数内で何かが発生しない可能性がある場合 (つまり、ファイルが見つからないなど)、戻り値が整数であることを宣言していました。すべてが順調であれば 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())無効です。次のように記述する必要があります。functionint

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 に答える