1

我是学习 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()));

我了解从 lst[3] 接收 StnNo 并通过

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

但我不明白这部分:

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

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

4

4 回答 4

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());
于 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.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);

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

于 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 回答