Nullable ToString()

时间:2010-03-15 17:11:53

标签: c# nullable

我看到所有的结构都像:

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();
}

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

6 个答案:

答案 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.
}