C# 如果为null,则使用null条件运算符将值设置为0
我对C语言不熟悉,但对一般编程不熟悉。 我正在尝试设置添加一些错误检查到我的程序。有3个文本框,我正在尝试设置它,以便如果文本框留空,它将假定值为0。以下是我目前的代码:C# 如果为null,则使用null条件运算符将值设置为0,c#,null-conditional-operator,C#,Null Conditional Operator,我对C语言不熟悉,但对一般编程不熟悉。 我正在尝试设置添加一些错误检查到我的程序。有3个文本框,我正在尝试设置它,以便如果文本框留空,它将假定值为0。以下是我目前的代码: private void btnCalculate_Click(object sender, EventArgs e) { if (String.IsNullOrEmpty(txtNumberOfClassATix.Text)) // Assumes 0 if no number ente
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,但我并没有真正掌握足够的知识来适应我的场景。为了保持简单,一个好方法是使用条件运算符。为了便于阅读,下面的完整示例分为两行:
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";
}
这适用于所有语句。为了保持简单,一个好的方法是使用条件运算符。为了便于阅读,下面的完整示例分为两行:
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";
}
这适用于所有语句。.这是使用一种方法的最佳时机,这样你就不会重复自己:
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
在其他方法中调用它,如下所示:
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}";
}
这是使用一种方法的最佳时机,这样你就不会重复你自己了:
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
在其他方法中调用它,如下所示:
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}";
}
到目前为止,麦克塞图拉的答案是最好的,但我们能做得更好吗?当然可以。让我们做一个通用的扩展方法:
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;
}
}
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;
}
}
现在:
int classANum = txtNumberOfClassATix.Text.AsInt() ?? 0;
如果是int,你得到int,如果不是,你得到零。简单的豌豆
或者,您可能需要此扩展方法:
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;
}
}
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;如果你想这样做,我建议你把它分成两个步骤:一个是导致变异的步骤,另一个是计算值的单独步骤。对其效果和值都有用的操作可能会令人困惑。到目前为止,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;
}
}
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;
}
}
现在:
int classANum = txtNumberOfClassATix.Text.AsInt() ?? 0;
如果是int,你得到int,如果不是,你得到零。简单的豌豆
或者,您可能需要此扩展方法:
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;
}
}
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;如果你想这样做,我建议你把它分成两个步骤:一个是导致变异的步骤,另一个是计算值的单独步骤。对其效果和值都有用的操作可能会令人困惑。减少代码行的最佳方法是将该函数用于常见操作。在您的情况下,您可以创建一个函数来检查对象是否为NULL或空。根据该函数的返回值,您可以继续。另一方面,您可以通过使用不同的验证器(如RequiredFieldValidator、CustomValidator等)在前端处理它。减少代码行的最佳方法是将该函数用于常见操作。在您的情况下,您可以创建一个函数来检查对象是否为NULL或空。根据该函数的返回值,您可以继续。另一方面,您可以通过使用不同的验证器(如RequiredFieldValidator、CustomValidator等)在前端处理它。您可以使用TryParse,如果失败则使用0。int classANum=int.TryParsetxtNumberOfCl
阿萨提克斯,文本,1号变量?val1:0;然后您可以删除解析上面的所有代码。空条件运算符仅适用于空值,而不适用于空字符串或空白值。我建议您按照int-parseNumberString文本{return string.IsNullOrEmptytext?0:int.Parsetext;}编写一个函数。考虑如何处理除空字符串以外的无效输入。您可以改用TryParse,如果失败,则使用0。int classANum=int.TryParsetxtNumberOfClassATix.Text,out var val1?val1:0;然后您可以删除解析上面的所有代码。空条件运算符仅适用于空值,而不适用于空字符串或空白值。我建议您按照int-parseNumberString文本{return string.IsNullOrEmptytext?0:int.Parsetext;}编写一个函数。考虑如何处理无效输入,而不是空字符串。