C# 什么';.ToString()和+&引用&引用;

C# 什么';.ToString()和+&引用&引用;,c#,string,datetime,C#,String,Datetime,如果我有约会时间,我会: date.Year.ToString() 我把这一年当作弦。但如果我这样做了 date.Year + "" 不同之处在于,如果没有日期,第二个没有例外?(这是我的首选)当您编写date.Year+“”时,它将被编译为对以下内容的调用: 在内部,Concat方法将对每个(非空)对象调用ToString 如果date为null,这两种方法都将抛出null引用异常。但是你说date属于DateTime类型DateTime是一个结构,因此不能为空 如果date的类型为Da

如果我有约会时间,我会:

date.Year.ToString()
我把这一年当作弦。但如果我这样做了

date.Year + ""

不同之处在于,如果没有日期,第二个没有例外?(这是我的首选)

当您编写
date.Year+“”
时,它将被编译为对以下内容的调用:

在内部,
Concat
方法将对每个(非空)对象调用
ToString

如果
date
null
,这两种方法都将抛出
null引用异常。但是你说
date
属于
DateTime
类型
DateTime
是一个结构,因此不能为空


如果
date
的类型为
DateTime?
,如果date为null,则希望返回空字符串,则可以使用以下方法:

date.HasValue ? date.Value.Year.ToString() : ""

如果
date.Year
不为空,则没有区别

在第二个示例中,
ToString()
方法在
date.Year
上隐式调用

date.Year.ToString()
如果日期为空,则不起作用

date.Year + ""
即使年份为空,也可以工作,因为二进制+运算符将空字符串替换为空字符串

这是MSDN关于连接两个字符串的二进制+运算符的说明:

当一个或两个操作数都是字符串类型时,二进制+运算符执行字符串串联。如果字符串串联的操作数为空,则替换空字符串。否则,任何非字符串参数都将通过调用从type对象继承的virtual ToString方法转换为其字符串表示形式。如果ToString返回null,则替换空字符串


更多关于

嗯,我不这么认为!在第二种情况下,如果年份为空,我不会得到任何错误/异常。只是,它什么都不做…
date.Year+“
即使date为null也能工作?真正地那么DateTime怎么可能是空的呢?马克说,它怎么是空的?这不是只有当它被声明为可空时才有可能吗?
date.Year + ""