![](/img/trans.png)
[英]Is it possible to use a null-conditional operator to set a Func<> to null?
[英]Use null-conditional operator to set value to 0 if null
我是C#的新手,但一般来说都不是编程。 我试图设置向程序添加一些错误检查。 有3个文本框,我正在尝试制作,以便如果文本框留为空白,则其值为0。这是到目前为止的代码:
private void btnCalculate_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(txtNumberOfClassATix.Text)) // Assumes 0 if no number entered for txtNumberOfClassATix.Text.
{
txtNumberOfClassATix.Text = "0";
}
if (String.IsNullOrEmpty(txtNumberOfClassBTix.Text)) // Assumes 0 if no number entered for txtNumberOfClassBTix.Text.
{
txtNumberOfClassBTix.Text = "0";
}
if (String.IsNullOrEmpty(txtNumberOfClassCTix.Text)) // Assumes 0 if no number entered for txtNumberOfClassCTix.Text.
{
txtNumberOfClassCTix.Text = "0";
}
int classANum = int.Parse(txtNumberOfClassATix.Text);
int classBNum = int.Parse(txtNumberOfClassBTix.Text);
int classCNum = int.Parse(txtNumberOfClassCTix.Text);
double classATotal = classANum * classAPrice;
double classBTotal = classBNum * classBPrice;
double classCTotal = classCNum * classCPrice;
lblCalculatedClassARevenue.Text = $"{classATotal:c}";
lblCalculatedClassBRevenue.Text = $"{classBTotal:c}";
lblCalculatedClassCRevenue.Text = $"{classCTotal:c}";
lblCalculatedTotalRevenue.Text = $"{(classATotal + classBTotal) + classCTotal:c}";
}
这段代码有效,但是我敢肯定我可以用更简单的方式替换那些if语句。 我已经看到了如何使用null条件运算符将变量设置为null(如果另一个变量为null),但是我对它的适应性还不足以适应我的情况。
到目前为止,maccettura的答案是最好的,但是我们可以做得更好吗? 我们当然可以。 让我们做一个通用的扩展方法:
internal static class Extensions
{
public static int? AsInt(this string s)
{
int result;
if (s == null)
return null;
else if (int.TryParse(s, out result))
return result;
else
return null;
}
}
现在:
int classANum = txtNumberOfClassATix.Text.AsInt() ?? 0;
如果是int,就可以得到int。 如果不是,您将得到零。 十分简单。
或者,您可能需要此扩展方法:
internal static class Extensions
{
public static int AsInt(this string s, int default = 0)
{
int result;
if (s == null)
return default;
else if (int.TryParse(s, out result))
return result;
else
return default;
}
}
现在,您无需使用??
即可说出默认值是什么??
。
这种编程风格称为“流利编程”。 它可以使代码易于阅读和理解。
请注意,此解决方案不更新与零的UI; 如果您想这样做,我建议将其分为两个步骤:一个导致突变,然后一个单独的步骤来计算值。 对于效果和价值都有用的操作可能会造成混淆。
这是使用方法的最佳时机,这样您就不必重复自己了:
private static int GetInputAsInt(TextBox textbox)
{
int outputValue = 0;
if(textbox?.Text != null && int.TryParse(textbox.Text, out outputValue))
{
return outputValue;
}
return 0;
}
现在,您正在检查文本框本身是否不为null,并且其中包含的值为int,如果失败,则返回0;否则,返回0。
像这样用其他方法调用它:
int classANum = GetInputAsInt(txtNumberOfClassATix);
这意味着您的按钮单击事件会更简单:
private void btnCalculate_Click(object sender, EventArgs e)
{
int classANum = GetInputAsInt(txtNumberOfClassATix);
int classBNum = GetInputAsInt(txtNumberOfClassBTix);
int classCNum = GetInputAsInt(txtNumberOfClassCTix);
double classATotal = classANum * classAPrice;
double classBTotal = classBNum * classBPrice;
double classCTotal = classCNum * classCPrice;
lblCalculatedClassARevenue.Text = $"{classATotal:c}";
lblCalculatedClassBRevenue.Text = $"{classBTotal:c}";
lblCalculatedClassCRevenue.Text = $"{classCTotal:c}";
lblCalculatedTotalRevenue.Text = $"{(classATotal + classBTotal) + classCTotal:c}";
}
为了简单起见,一个好的方法是使用条件运算符。 下面是完整的示例(为了便于阅读,分为两行):
txtNumberOfClassATix.Text =
String.IsNullOrEmpty(txtNumberOfClassATix.Text) ? "0" : txtNumberOfClassATix.Text;
对于第一部分,这是一个很好的可读性分配:
myString = ...
条件运算符通过在?
的左侧提供一个布尔表达式( true
/ false
)来分解?
。 因此,例如:
myString = anotherString == "" ? ... // checking if another string is empty
最后部分是:
。 左边是赋值如果表达式为true
,并在右边去分配如果表达式为false
。 完成示例:
myString = anotherString == "" ? "anotherString is empty" : "anotherString is not empty";
可以完整编写上面的示例,以消除任何误解:
if (anotherString == "")
{
myString = "anotherString is empty";
}
else
{
myString = "anotherString is not empty";
}
这可以适用于所有语句。 该文档位于此处 。
减少代码行的最佳方法是将函数用于您的常用操作。 在您的情况下,您可以创建函数来检查对象是否为NULL或为空。 根据该函数的返回值,您可以继续进行。 另一方面,您可以使用不同的验证器(例如RequiredFieldValidator,CustomValidator等)在前端进行处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.