我有一个方法,我做了类似的事情:
int? products= formvalues["number"] == "" ? (int?)null : Convert.ToInt32(formvalues["number"]);
if(products.HasValue)
{
// do some calulation
}
问题是我不想做计算,如果产品有0或null值,否则做计算,我怎么能这样做,因为当前逻辑避免计算时它的null但它不会避免当产品有0值
答案 0 :(得分:7)
if(products.HasValue && products !=0)
{
// do some calculation
}
这是有效的,因为if
正在使用Short-circuit evaluation:只有在products!=0
为真时才评估product.HasValue
条件。
修改强>
这个特殊的if语句也可以在没有短路评估的情况下工作,因为null!=0
- 如果你必须通过在if语句前面加上空值检查来访问变量的成员,那么短路验证很有用。
同样指出Nullable<T>
提供了GetValueOrDefault()
方法来执行与上面相同的检查(@Bradley得到我的+1) - 在这种情况下,这是个人偏好/可读性的问题,使用
真实回答您的问题应该是使用Int32.TryParse()
而不是“手动”尝试验证输入。
答案 1 :(得分:5)
使用原始代码,您可以写:
if (products.GetValueOrDefault() != 0)
{
// do some calulation
}
如果products
为null
, GetValueOrDefault
将返回0。
但是,我可能会将其写成如下(以避免FormatException
未能解析用户提交的数据而引发的潜在Convert.ToInt32
:
int products;
if (int.TryParse(formvalues["number"], out products) && products != 0)
{
// do some calculation
}
答案 2 :(得分:2)
摆脱可以为空的int并执行更安全的转换:
int products;
bool parsed = Int32.TryParse(formvalues["number"], out products);
if (parsed && products != 0)
{
}
答案 3 :(得分:1)
试试这个
if (products.HasValue && products.Value != 0)
{
// do some calulation
}
答案 4 :(得分:1)
我更喜欢这个if((products ?? 0) != 0){}