我看到所有的结构都像:
int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;
为什么不简单地使用:
string test = myVar.ToString();
那不完全一样吗? 至少Reflector说:
public override string ToString()
{
if (!this.HasValue)
{
return "";
}
return this.value.ToString();
}
那么,这是正确的(较短的版本)还是我错过了什么?
答案 0 :(得分:108)
你是对的。同样在this question中,建议使用前一种解决方案,而实际上没有人注意到ToString()
已经给出了正确答案。
对于更详细的解决方案,可能的论点是可读性:当您在假设为ToString()
的某些内容上调用null
时,通常期望 a NullReferenceException
,虽然这里没有抛出。
答案 1 :(得分:14)
我认为很多人都有这样的检查,因为它不是一个可以保持空值的对象的自然行为。
答案 2 :(得分:5)
不,你是对的,较短的版本与其他人在这方面的做法相同。我倾向于使用的另一个构造代替具有nullables的三元组是空合并运算符。它还可以保护您免受空值的影响。对于ToString(),没有必要(正如你所指出的那样)但是对于默认的int值(例如),它可以很好地工作,例如:
int page = currentPage ?? 1;
允许你在页面上执行所有整数操作,首先显式空检查并调用currentPage中的值(其中currentPage是一个int?可能作为参数传递)
答案 3 :(得分:5)
我知道,很久以后就相关了,但是......我怀疑是因为像int这样的可空类型? .ToString()方法不允许您使用格式字符串。见How can I format a nullable DateTime with ToString()?。也许在原始代码中,.ToString()中有一个格式字符串,或者编码器忘了没有格式字符串的.ToString()仍然可以在可空类型上使用。
答案 4 :(得分:3)
可能只是遵循模式?或者他们不知道后端。你是正确的代码完全相同。你甚至可以这样做:
int? i = null;
i.ToString(); //No NullReferenceException
答案 5 :(得分:1)
int?
是语法糖,可简化可空变量的声明。
它与Nullable<int>
相同。
因此,如果您看一下ToString()
(见下文)的Nullable<T>
方法的实现,您会注意到,如果它返回空字符串,没有价值。
public struct Nullable<T> where T : struct
{
public override string ToString()
{
if (!this.hasValue)
return "";
return this.value.ToString();
}
}
MSDN所说:
Nullable.ToString方法
返回当前Nullable对象的值的文本表示形式 如果HasValue属性为true,则为空字符串(“”),如果 HasValue属性为false。
因此,以下代码将向控制台输出空字符串,而不是抛出ArgumentNullException
异常。
static void Main(string[] args)
{
int? a = null;
Console.WriteLine(a.ToString()); // Prints empty string to console.
}