0

文字列から解析されたintを受け取るAPIを作成している場合、「out」値で何かを実行するメソッドからparseメソッドを分離することをお勧めしますか?

はいと思う理由は、コードがより明確になるからです。たとえば、解析に関連する例外が発生した場合、スタックで「ああ、そうです、それは明らかにParse()と呼ばれる最上位のメソッドになります!」と言うことができます。コードベースを見る前に。nullは、行われた技術的な決定を理解していない他の開発者によるバグをもたらす可能性があるため、間違った選択だと思います(これは宗教的に文書化していますが)。

ただし、スタックの5レベルの深さのメソッドで、エラー文字列メッセージを「リレー」するにはどうすればよいですか?

ありがとう

4

3 に答える 3

0

エラー文字列メッセージを中継するには、例外を作成して「throw」キーワードを使用します。

解析メソッドの分離に関して、これはあなたが求めているものですか?

int myInt;
if(!Int32.TryParse(inputString, out int myInt))
    throw new System.ArgumentException("Invalid Argument", "inputString");

methodThatUsesInt(myInt);
于 2012-06-11T21:02:34.800 に答える
0

ArgumentExceptionをスローする必要があります。

于 2012-06-11T20:56:20.700 に答える
0

あなたの質問は少し不明確です。あなたのメソッドは、整数として解析可能であるはずの文字列を受け取り、そのような解析の数値結果を使って何かを行うと言っていますか?

メソッドに多数の無効な文字列がフィードされる可能性が低く、無効な文字列を受け取った場合にルーチンが実行できる有用なことが何もない場合は、無効な文字列がメソッドが十分に複雑な解析を実行し、呼び出し元がルーチンが解析するのと同じくらい多くの作業を行わずに文字列を十分に検証できなかった場合、ルーチンはすべての適切な文字列をバッチで処理することが期待されます良い文字列と悪い文字列が混在している場合、一般的なパターンは、のスタイルでメソッドを公開することですbool TryParse(string st, ref int result)。個人的には、解析が失敗した理由を示すメカニズムがないため、このパターンは好きではありません。別のパターンをお勧めします-これらのいずれかのようなもの:

int TryParse(string st、out ParseStatus status);
int TryParse(string st、Action <ParseStatus> failureAction);
void ActionRV <RefT、ValT>(ref RefT refparam、ValT valparam);を委任します。
int TryParse <RefPT>(string st、ActionRV <RefT、ParseStatus> FailureAction、
                        ref RefT refParam);

これらの3つの呼び出しパターンすべてで、が継承可能なタイプである場合、障害を正確に説明するインスタンスまたは派生タイプを提供ParseStatusすることが可能になります。2番目と3番目のパターンの場合、デリゲートは例外自体をスローするか、呼び出し元の関数に返される値を格納するか、元のパラメーター文字列を変更して(に格納されている場合)、 「再試行」を要求するフラグ。どちらかが機能する場合は、クロージャーよりもパラメーターを優先する必要があると思うので、個人的には3番目の形式が好きです。2番目の形式は、3番目の形式で効率的に実装できることに注意してください。TryParseParseStatusParseStatusParseStatusref

static ExecAction <T>(T param、ref Action <T> proc)
{{
  proc(param);
}
int TryParse(string st、Action <ParseStatus> failureAction)
{{
  TryParse(st、ExecAction、ref failureAction);
}

refパラメーターとしてasを渡すことfailureActionは、クロージャを使用する代わりに、ラッパー関数に静的デリゲートを使用できることを意味することに注意してください。

于 2012-06-13T15:25:31.457 に答える