0

検証を実行するメソッドがいくつかあります。tryParseは私が使用する主要な関数の1つです。

私は次のようなコードになります:

bool isValid = true;

int dealId;
isValid = !int.TryParse(strArr[0], out dealId) ? false : isValid;

DateTime createdOn;
isValid = !DateTime.TryParse(strArr[1], out createdOn) ? false : isValid;

isValid = !tmp.Add(new BookmarkedDeal(userId, dealId, createdOn)) ? false : isValid;

結果がfalseの場合にのみisValidをfalseに設定するより良い方法はありますか?

4

4 に答える 4

2

これは、「より良い」の定義によって異なりますが、次のようなことができます。

int dealId;
DateTime createdOn;

return int.TryParse(strArr[0], out dealId) &&
       DateTime.TryParse(strArr[1], out createdOn) && 
       tmp.Add(new BookmarkedDeal(userId, dealId, createdOn))

(もちろん、これをメソッドから返すと仮定します。そうでない場合は、thisの値をaに設定して、bool isValid以前と同じように使用できます)

&&条件付きAND演算子と呼ばれます。基本的な考え方は、戻り値が条件を満たすかどうかを確認するのに十分なだけ評価するということです。したがって、最初にint.TryParse()trueを返すかどうかを確認し、trueを返す場合は確認DateTime.TryParse()し、次にtrueを返すかどうかを次のメソッドで確認します。この演算子の利点は、失敗した場合、それがtrueになる可能性がないことを認識し、すぐにfalseを返すことです。

(同じように動作する条件付きOR演算子(||)もありますが、aに達するまで十分に公平に評価される場合はtrue、式全体が真になります)。

于 2012-08-17T16:25:50.140 に答える
1

短絡評価:

int dealId;
DateTime createdOn;

bool isValid = int.TryParse(strArr[0], out dealId)
               &&
               DateTime.TryParse(strArr[1], out createdOn)
               &&
               tmp.Add(new BookmarkedDeal(userId, dealId, createdOn));

(上記では、ステートメントは短絡します。つまり、用語がfalseと評価されるとすぐに評価が停止します)

さらに、失敗する可能性が最も高いものが最初に来るように検証を注文することができます...その後、他のパスを探索しないことで、検証をより迅速に実行できます。(時期尚早の最適化の良い例です...しかし、各用語の実行に時間がかかる可能性がある場合は、覚えておく価値があります)。

================================================== ==============================

それを行う2つの代替方法。各用語を評価し、評価のいずれかがfalseの場合はisValid=falseを記録します。

論理積(&&)の使用:

(前のisValidがfalseの場合に短絡を回避するために、式の右側に「&& isValid」を配置することが重要です)。

int dealId;
DateTime createdOn;

bool isValid = int.TryParse(strArr[0], out dealId);
isValid = DateTime.TryParse(strArr[1], out createdOn) && isValid;
isValid = tmp.Add(new BookmarkedDeal(userId, dealId, createdOn)) && isValid;

ビットごとのAND(&)の使用:

int dealId;
DateTime createdOn;

bool isValid = int.TryParse(strArr[0], out dealId)
               &
               DateTime.TryParse(strArr[1], out createdOn)
               &
               tmp.Add(new BookmarkedDeal(userId, dealId, createdOn));
于 2012-08-17T16:25:51.707 に答える
1

これはどう:

int dealId;
DateTime createdOn;
bool isValid = int.TryParse(strArr[0], out dealId) && 
     DateTime.TryParse(strArr[1], out createdOn) && 
     tmp.Add(new BookmarkedDeal(userId, dealId, createdOn)

&&は左から右に実行されるため、前の呼び出しから取得された変数は次の呼び出しの準備ができています。

于 2012-08-17T16:27:10.803 に答える
-1

これがあなたがアプローチできる別の方法です。paramsを渡すことのオーバーヘッドがシステムにどのくらいの費用がかかるかわからないので、エラーが発生した場合にそれをキャッチしてみませんか?

bool isValid;
try
{ 
   int dealID = int.Parse(strArr[0]);
   DateTime createdOn = DateTime.Parse(strArry[1]);
   tmp.Add(new BookmarkedDeal(userId, dealId, createdOn);
   isValid = true;
}
catch
{
   isValid = false;
}
于 2012-08-17T16:42:51.930 に答える