可空的ToString()

我看到无处不在的build筑如:

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

为什么不简单使用:

 string test = myVar.ToString(); 

这不完全一样吗? 至lessReflector说:

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

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

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

也许更详细的解决scheme的参数是可读性:当你应该null东西时调用ToString() ,你通常期望一个NullReferenceException ,虽然在这里它不会被抛出。

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

不,你说得对,这个简短的版本和其他人在这方面做的一样。 我倾向于使用很多,而不是与三元组可空的另一个构造是空合并运算符。 这也保护你免于空值。 对于ToString(),没有必要(正如你指出的那样),但是对于默认的int值(例如),它可以很好地工作,例如:

 int page = currentPage ?? 1; 

它可以让你在页面上执行所有的整数操作,首先显式地检查null,然后调用currentPage中的值(currentPage是一个inttypes,也许作为parameter passing)

我知道,很长时间后有关,但是…我怀疑这是因为像int这样的可空types? .ToString()方法不允许使用格式string。 请参阅如何使用ToString()格式化可空的DateTime? 。 也许在原始代码中,在.ToString()中有一个格式化string,或者编码器忘记了。没有格式string的.ToString()在可为空的types上仍然可用。

可能只是遵循模式? 或者他们不知道后端。 你是正确的代码是完全一样的。 你甚至可以这样做:

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