C# 可为null的ToString()
我到处都能看到这样的建筑:C# 可为null的ToString(),c#,nullable,C#,Nullable,我到处都能看到这样的建筑: int? myVar = null; string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty; 为什么不简单地使用: string test = myVar.ToString(); 这不是完全一样吗? 至少他说: public override string ToString() { if (!this.HasValue) { return ""; } ret
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();
}
那么,这是正确的(较短的版本)还是我遗漏了什么?我认为很多人有这样的检查,因为它不是一个可以保持空值的对象的自然行为。也许只是遵循一种模式?或者他们不知道后端。你是对的,代码完全相同。你甚至可以:
int? i = null;
i.ToString(); //No NullReferenceException
不,你是对的,较短的版本与其他人在这方面所做的相同。我倾向于大量使用的另一个构造,而不是带null的三元结构,是null合并操作符,。它还可以保护您不受空值的影响。对于ToString(),它不是必需的(正如您所指出的),但是对于默认的int值(例如),它工作得很好,例如:
int page = currentPage ?? 1;
这使您可以在页面上执行所有整数操作,首先显式地检查并调用currentPage中的值(其中currentPage是int?可能作为参数传递)您是完全正确的。同样在中,建议使用前一种解决方案,但实际上没有人注意到
ToString()
已经给出了正确的答案
也许更详细的解决方案的论据是可读性:当您对本应为
null
的某个对象调用ToString()
时,您通常期望出现NullReferenceException
,尽管这里没有抛出它。我知道,在它相关很久之后,但是。。。我怀疑这是因为像int这样的可为空类型?.ToString()方法不允许使用格式字符串。看见可能在原始代码中,.ToString()中有一个格式字符串,或者可能是程序员忘记了,没有格式字符串的.ToString()在可空类型上仍然可用。int?
是简化可空变量声明的语法糖。
它与Nullable
相同
因此,如果您查看Nullable
(参见下文)的ToString()方法的实现,您会注意到,如果没有值,它将返回空字符串
public struct Nullable<T> where T : struct
{
public override string ToString()
{
if (!this.hasValue)
return "";
return this.value.ToString();
}
}
@安德鲁同意,因为人们(像我一样)一开始认为它会抛出一个例外。我不知道这是一种行为。我肯定会认为,如果调用x.ToString(),任何为(x==null)返回true的构造也会抛出NullReferenceException。事实上,至少有两个人注意到了:Eric Lippert和Johannes Rössel。虽然我肯定这不是你的意思,但这里的引用实际上不是null。Nullable是一种值类型。这就是为什么调用ToString()
时不会抛出任何NullReferenceException
异常的原因。如果这是一种心态,你会期望.HasValue
仍然抛出该异常。人们使用详细版本的另一个原因可能是为了与myNullableDateTime.HasValue这样的表达式对等?myNullableDateTime.Value.ToString(“d”):null
其中确实需要展开的对象来访问所需的ToString
方法。当然,还有一个更简洁的解决方案:$“{myNullableDateTime:d}”
如果ToString()需要具有不变的区域性,您可能需要走很长的路,因为nullables在其菜单中没有它。我没有见过这样的代码:)
static void Main(string[] args)
{
int? a = null;
Console.WriteLine(a.ToString()); // Prints empty string to console.
}