非空字符串初始化为null

8

我想理解为什么非空字符串会初始化为null而不是空字符串。例如:

//Property of class foo
public string Address_Notes { get; set; }

//Create instance of foo
foo myFoo = new foo();

//Get value of Address_Notes
var notesValue = myFoo.Address_Notes; //Returns null

我是否有些疯狂地认为非空字符串的值应默认为String.Empty?除了使用自定义getter方法之外,是否有强制这种行为的标准方式?

4
“non-nullable” string(非空字符串)指的是在编程中,定义了一个字符串类型的变量并要求其值不为空。 - CodingGorilla
1
@CodingGorilla,你知道吗,我发完这个帖子后,我想到了一个问题——“什么是非空字符串?”老实说,我不确定我当时在想什么。我把它归咎于在写ColdFusion之前使用了一种真正的语言... - James Hill
实际上,如果您使用Spec#,则可以编写像'void Test(string!s)'这样的签名,其中表示's不应为空'。好吧,那是空检查而不是非空检查,但是如果它进入C#,我期望你会有后续问题 :-) - mtijn
4个回答

24

没有所谓的“非空字符串”。

字符串是一个引用类型,因此它的默认值确实是 null。

你可以通过在类(foo)的构造函数中将值设置为 String.Empty 来解决这个问题。


11

字符串是引用类型,它始终可为空。


3

字符串是引用类型 - 默认情况下,值被初始化为null

您可以在构造函数中将字符串初始化为string.Empty,最好这样做,因为:

  • null表示“我不知道是什么值”
  • string.Empty表示“值为空”或“值不存在”。

因此,几乎每个字符串属性都应该(由您)初始化为string.Empty值。尝试阅读有关“空对象模式”的内容。编程根据此原则可以使代码更易读且更少出错。


1
我知道这个答案很老,但有很多时候空初始化是完全合适的,特别是那些你不知道值的情况。例如,如果您有一个数据传输对象和一个字符串属性,则构造函数将其初始化为null是有意义的,因为创建该类定义的人真的不想说“我知道这个值为空,直到你告诉我否则。”出于这个原因,我使我的DTO中的所有属性都可为空,例如Int32?。为什么?我事先不知道零是否有效! - Becca Dee

1
由于您使用属性获取字符串值,另一个选项是如果实际上为空,则返回string.Empty。
//Property of class foo
private string _address_Notes;
public string Address_Notes 
{ 
    get { return _address_Notes ?? string.Empty; } 
    set { _address_Notes = value; }
}

一个更好的解决方案是将字符串初始化为string.Empty(如果这是您期望的行为)。在C# 6+中,您可以按照以下方式执行此操作:
public string Address_Notes { get; set; } = string.Empty;

这样做是一次性的初始化,而不是每个请求都进行检查。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接