可空 ToString()

我到处都能看到这样的建筑:

int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;

为什么不简单地使用:

string test = myVar.ToString();

这难道不是一样的吗? 至少反射器说:

public override string ToString()
{
if (!this.HasValue)
{
return "";
}
return this.value.ToString();
}

那么,这是正确的(较短的版本)还是我遗漏了什么?

39491 次浏览

我认为许多人之所以有这样的检查,是因为它不是一个可以保持空值的对象的自然行为。

也许这只是为了遵循一种模式?或者他们不知道后台。你说得对,密码完全一样。你甚至可以这样做:

int? i = null;
i.ToString(); //No NullReferenceException

不,你是对的,简短的版本和其他人在这方面的做法是一样的。另一个我倾向于大量使用而不是使用带有空值的三元结构的结构是 null 合并运算符,。同时也保护你不受空的伤害。对于 ToString () ,它不是必需的(正如您指出的) ,但是对于默认的 int 值(例如) ,它工作得很好,例如:

int page = currentPage ?? 1;

它允许您在页面 w/o 上执行所有整数操作,首先显式检查 null 并调用 currentPage 中的值(其中 currentPage 是 int?也许被当作帕拉姆(param)

你说得很对。同样在 这个问题中,前一种解决方案是建议的,而实际上没有人注意到 ToString()已经给出了正确的答案。

也许更详细的解决方案的参数是可读性: 当对 假设null的东西调用 ToString()时,通常 期待NullReferenceException,尽管这里没有抛出它。

我知道,但是... 我怀疑这是因为对于像 int 这样的可空类型?的。方法不允许使用格式化字符串。参见 如何使用 ToString ()格式化可为空的 DateTime?。在原始代码中,可能有一个格式字符串。ToString () ,或者可能是编码器忘记了这一点。没有格式字符串的 ToString ()对于可为空的类型仍然可用。

int?是语法 Sugar,它简化了可空变量的声明。 它和 Nullable<int>是一样的。

因此,如果您查看 Nullable<T> (见下文)ToString()方法的实现,您可以注意到,如果它没有值,它将返回空字符串。

public struct Nullable<T> where T : struct
{
public override string ToString()
{
if (!this.hasValue)
return "";
return this.value.ToString();
}
}

MSDN 说:

ToString 方法

返回当前 Nullable 对象值的文本表示形式 如果 HasValue 属性为 true,则为空字符串(“”) HasValue 属性为 false。

因此,下面的代码将打印空字符串到控制台,而不是抛出 ArgumentNullException异常。

static void Main(string[] args)
{
int? a = null;
Console.WriteLine(a.ToString()); // Prints empty string to console.
}