.ToString()不会引发double类型的异常?或长时间?虽然它会在空字符串上引发异常
本文关键字:异常 字符串 长时间 double 类型 ToString | 更新日期: 2023-09-27 18:04:49
我有以下三个属性:-
public Nullable<double> SPEED { get; set; }
public Nullable<Int64> PROCESSORCOUNT { get; set; }
public string CPUNAME { get; set; }
现在在我的asp.net mvc5 web应用程序的控制器类中,如果我为上述三个变量传递null,如下所示:
query["proSpeed"] = sj.SPEED.ToString();
query["proCores"] = sj.PROCESSORCOUNT.ToString();
query["proType"] = sj.CPUNAME.ToString();
那么toString()只会在空字符串上引发异常,主要是sj.CPUNAME.ToString();
,所以有人能告诉为什么ToString()
不会引发异常,如果我试图将包含空值的double?
或long?
转换为字符串,但它只会在字符串为空时引发空引用异常吗?
简化一下:
int? x = null;
string result = x.ToString(); // No exception
这里null
不是空引用。它只是一个int?
类型的空值,即Nullable<int>
类型的值,其中HasValue
为假。
你只是在那个值上调用Nullable<T>.ToString()
方法。没有null引用,所以没有NullReferenceException
。该行为被记录为:
如果
HasValue
属性为真,则当前Nullable<T>
对象的值的文本表示形式;如果HasValue
属性为假,则为空字符串(")。
换句话说,它可以有效地实现为:
return HasValue ? Value.ToString() : "";
注意,这只在编译时类型是可空类型时才有效。
如果你最终装箱一个空值,你最终会得到一个空引用:
object y = x; // Oh noes, now y is a null reference...
string bang = y.ToString(); // so this throws!
Nullable<T>
本身不能为空,但它的值可以。例如,您可以将其ToString
方法实现为:
public string override ToString()
{
if (this.HasValue) return this.Value;
else return string.Empty;
}
您不能对string
做同样的事情,因此,如果字符串为空,则会引发NullReferenceException
。
MSDN帮助对此非常清楚。
当前Nullable对象值的文本表示形式如果HasValue属性为真,则为空字符串(")HasValue属性为false