1

私はC#とSilverlightの学習に不慣れであり、学習を開始するために雇用主からいくつかのアプリケーションファイルを提供されています。C#で使用されているロジック、メソッド、構文のほとんどを理解できますが、非常に混乱する1行があります。私は今、先輩に尋ねるアクセス権がないので、その背後にある論理があるので、ここで尋ねようと思いました。

これを見てください:

.xaml.csファイルの場合:

List<object> lst = new List<object>();
lst.Add(GP.mpl.A);
lst.Add(GP.mpl.B);
lst.Add(GP.mpl.C);
lst.Add(GP.mpl.StnNo);

別の.csファイル:

public int StnNo = Convert.ToInt32(lst[3].ToString() == string.Empty ? 0 : Convert.ToInt32(lst[3].ToString()));

StnNoがlst[3]から受信され、整数に変換されていることを理解しています。

Convert.ToInt32(lst[3].ToString()

しかし、私はこの部分を理解していません:

== string.Empty ? 0 : Convert.ToInt32(lst[3].ToString())

そこで何が起こっているのか教えていただけますか?私はグーグルで複数の検索をしましたが、関連するものは何も見つかりませんでした。助けてくれてありがとう。

4

4 に答える 4

2

これは条件付き演算子であり、三項演算子と呼ばれることもあります。

ブール式の形式を取りますか?真の値:偽の値。

C#では、true値とfalse値が同じタイプであるか、一方が他方に暗黙的に変換可能である必要があります(両方ではありません)。それ以外の場合は、一方または両方を共通のタイプに合法かつ明示的にキャストする必要があります。

あなたのコードでは、あなたは

int StnNo = Convert.ToInt32(lst[3].ToString() == string.Empty ? 0 : Convert.ToInt32(lst[3].ToString()));

それは同等の機能を生み出しています

int temp;
if (lst[3].ToString() == string.Empty)
    temp= 0;
else 
    temp = Convert.ToInt32(lst[3].ToString());

int StnNo = Convert.ToInt32(temp);

コードの外側Convert.ToInt32は実際には冗長であり、削除できることがわかります。

int StnNo = lst[3].ToString() == string.Empty ? 0 : Convert.ToInt32(lst[3].ToString());
于 2013-03-25T05:34:40.773 に答える
2

?三項演算子です。

condition ? first_expression : second_expression;

だからあなたの例では、

public int StnNo = Convert.ToInt32(lst[3].ToString() == string.Empty ? 0 : Convert.ToInt32(lst[3].ToString()));

に等しい

public int StnNo;
if (lst[3].ToString() == string.Empty)
{
    StnNo = 0;
}
else
{
    StnNo = Convert.ToInt32(lst[3].ToString());
}
于 2013-03-25T05:34:55.570 に答える
1

lst[3]これは、「空の場合は使用し0、それ以外の場合は解析する」という非常に不十分な記述方法ですlst[3]。質問が示すように、元の開発者が何を意図していたかを正確に判断するのは難しいためです。

より明確にするために、それを分析しましょう。

  • lst[3].ToString() == string.Emptylst[3]「空の文字列に評価されますか?」という意味です。
  • ? X : Y「もしそうならX、そうでなければY
    • 0定数値
    • Convert.ToInt32(lst[3].ToString())lst[3]値を整数として解析します。
  • 最後に、式全体が別のに渡されますConvert.ToInt32が、条件式の結果は常に。であるため、これは完全に不要ですint

2回呼び出す必要がないのでConvert.ToInt32、これを書くためのより良い方法は次のようになります。

public int StnNo = 
    (lst[3].ToString() == string.Empty 
    ? 0 
    : Convert.ToInt32(lst[3].ToString()));

これを書くさらに良い方法は次のとおりです。

int StnNo; 
int.TryParse(lst[3], out StnNo);

コードの行数は多くなりますが、読みやすくなります。

于 2013-03-25T05:34:57.343 に答える
0

== string.Empty ? 0 : Convert.ToInt32(lst[3].ToString())に値が含まれていない場合lst[3]は、に0が割り当てられることを確認しStnNoます。

于 2013-03-25T05:36:43.970 に答える