什么是令人困惑的表达“a == b?value1:value2”?

时间:2013-03-25 05:31:44

标签: c# silverlight

我是学习C#和Silverlight的新手,并且我的雇主已经给了一些应用程序文件以开始学习。我能够理解C#中使用的大多数逻辑,方法和语法,但有一行对我来说非常混乱。我现在没有机会接触我的老人,问他们背后的逻辑,所以我想我会在这里问。

看看这个:

在.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]收到并通过
转换为Integer

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

但我不明白这一部分:

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

你能告诉我那里发生了什么吗?我在谷歌上做过多次搜索,但没有发现任何相关内容。谢谢你的帮助。

4 个答案:

答案 0 :(得分: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());

答案 1 :(得分: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());
}

答案 2 :(得分: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);

这是更多的代码行,但它更容易阅读。

答案 3 :(得分:0)

== string.Empty ? 0 : Convert.ToInt32(lst[3].ToString())是检查如果lst[3]不包含任何值,则会将{0}分配给StnNo

相关问题