2013-03-25 4 views
1

Я новичок в обучении C# и Silverlight и получил некоторые файлы приложений моим работодателем, чтобы начать обучение. Я могу понять большую часть логики, методов и синтаксиса, используемых в C#, но есть одна строка, которая меня очень сбивает с толку. У меня нет доступа к моим пожилым прямо сейчас, чтобы спросить их, так что логика позади него, поэтому я подумал, что спрошу здесь.Что это за смутное выражение «a == b? Value1: value2»?

Взгляните на это:

В виде .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 это время полученные от 1-го [3] и преобразованные в Integer через

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

Но я не понимаю эту часть:

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

Не могли бы вы сказать мне, что там происходит? Я сделал несколько поисков в google, но не нашел ничего связанного. Спасибо за любую помощь.

+0

'[состояние]? [true part]: [false part] 'равно' if ([condition]) {[true part]} else {[false part]} ' – Corak

+0

[Условный оператор] (http://msdn.microsoft.com/ en-us/library/ty67wk28.aspx) – Habib

+0

Убило бы вас, чтобы попробовать и форматировать код правильно? –

ответ

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()); 
} 
+0

Получил это. Благодаря! –

+0

Добро пожаловать ': D' –

2

Это условный, иногда называемый тернарный, оператор.

Он принимает форму булево выражение? истинное значение: ложное значение.

В C# истинное значение и ложное значение должны быть одного типа или должны быть неявно конвертируемыми в другие (но не оба). В противном случае вы должны легально и явно наложить один или оба на общий тип.

В своем коде, у вас есть

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()); 
1

Это очень плохо написана способ сказать «если lst[3] пуст, затем используйте 0, в противном случае проанализируйте lst[3] "- потому что, как показывает ваш вопрос, сложнее сказать, что именно хотел использовать оригинальный разработчик.

Чтобы сделать его более понятным, давайте рассмотрим его.

  • lst[3].ToString() == string.Empty означает "делает lst[3] оценить в пустую строку?"
  • ? X : Y означает «если да, то X, в противном случае Y.
    • 0 постоянного значение
    • Convert.ToInt32(lst[3].ToString()) анализирует значение как lst[3] целого.
  • Наконец, все выражение передается в другую Convert.ToInt32, но это совершенно не нужно, поскольку результат условного выражения всегда равен int.

Поскольку вы не должны вызывать Convert.ToInt32 дважды, лучший способ написания этого будет:

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

Еще лучший способ написания этого будет:

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

Это больше строки кода, но читать их гораздо проще.

+1

Что плохого в этом? – Corak

+1

@ Корак плохо в смысле неразборчивости. Он также избыточен при вызове 'ToString()' и 'Convert.ToInt32' дважды, когда это действительно не нужно. –

+0

@ AnthonyPegram Хороший улов, спасибо. –

0

== string.Empty ? 0 : Convert.ToInt32(lst[3].ToString()) должен проверить, что если lst[3] не содержит никакого значения, то 0 будет присвоено StnNo.

Смежные вопросы