我是学习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())
你能告诉我那里发生了什么吗?我在谷歌上做过多次搜索,但没有发现任何相关内容。谢谢你的帮助。
答案 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
。