默认string初始化:NULL还是空?

我总是把我的string初始化为NULL,并认为NULL意味着缺less一个值,而“”或String.Empty是一个有效的值。 我已经看到了更多的例子CodeGo.net,其中String.Empty被认为是默认值或代表没有价值。 这让我觉得奇怪,在c#中添加了新的可空types,好像我们正在用string向后迈进,而不使用NULL来表示“无值”。

你使用什么作为默认的初始化器,为什么?

编辑:基于这个答案,我进一步思考

  1. 避免error handling如果值不能为空,为什么它首先被设置为NULL ? 也许最好是在发生错误的地方找出错误,而不是在整个代码库中覆盖错误?

  2. 避免空值检查如果你已经厌倦了在代码中进行空值检查,抽象空检查不是更好吗? 也许包装(或扩展!)的string方法,使他们安全的NULL ? 如果你经常使用String.Empty而null发生了什么事,它会进入你的系统,你会开始添加NULL检查吗?

我不禁回到了懒惰的意见。 如果你在他的数据库中使用了''而不是null ,那么任何DBA都会打你九招愚蠢的。 我认为在编程中也应用了相同的原则,并且应该有人使用String.Empty而不是NULL来代表没有价值的人。

相关问题

  • 在C#中,我应该使用string.Empty或String.Empty或“”?
  • String.Empty和“”之间的区别是什么
  • 空或空string表示表列没有数据?

用于区分“空”和NULL。 我同意“空”应该是“有效,但空白”和“空”应该是“无效”。

所以我会这样回答你的问题:

当我想要一个有效的默认值,可以或不可以改变,例如,一个用户的中间名,为

如果随后的代码没有明确设置值,则为NULL

根据MSDN :

通过用Empty值而不是null初始化string,可以减less发生NullReferenceException的机会。

尽pipe如此,总是使用IsNullOrEmpty()是很好的做法。

为什么你想要你的string被初始化呢? 当你声明一个variables的时候,你不需要初始化一个variables,而只有当你分配的值在代码块的上下文中有效时才应该这样做。

我看到很多:

 string name = null; // or String.Empty if (condition) { name = "foo"; } else { name = "bar"; } return name; 

不初始化为null将一样有效。 此外,大多数情况下您希望分配一个值。 通过初始化为null,您可能会遗漏不分配值的代码path。 像这样:

 string name = null; // or String.Empty if (condition) { name = "foo"; } else if (othercondition) { name = "bar"; } return name; //returns null when condition and othercondition are false 

当你不初始化为null时,编译器会产生一个错误,说明并不是所有的代码path都赋值。 当然,这是一个非常简单的例子

Matthijs

对于绝大多数不是string处理软件的软件,程序逻辑不应该依赖于stringvariables的内容。 每当我在程序中看到类似的东西时,

 if (s == "value") 

我感觉不好。 为什么在这个方法中有一个string字面值? 什么是设置? 它知道逻辑取决于string的值吗? 它是否知道它必须是小写工作? 我应该通过改变它来使用String.Compare来解决这个String.Compare吗? 我应该创build一个Enum并parsing它?

从这个angular度来看,有一个非常简单的代码哲学:尽可能避免检查string的内容。 将一个string与String.Empty比较实际上只是将它与一个文字进行比较的一种特殊情况:除非您真的必须这样做,否则应该避免这样做。

知道这一点,当我在我们的代码库中看到类似的东西时,我不会眨眼:

 string msg = Validate(item); if (msg != null) { DisplayErrorMessage(msg); return; } 

我知道Validate永远不会返回String.Empty ,因为我们编写比这更好的代码。

当然,世界其他地方并不是这样的。 当你的程序处理用户input,数据库,文件等时,你必须考虑其他的哲学。 在那里,你的代码的工作是对混乱施加秩序。 该命令的一部分是知道什么时候一个空string应该意味着String.Empty和什么时候应该表示为null

(只是为了确保我没有说出我的屁股,我刚刚search我们的代码库'String.IsNullOrEmpty'。所有54出现在方法处理用户input,从Python脚本返回值,检查从外部API等)

这取决于。

你需要能够知道是否缺less值(是否有可能不被定义)?

空string是该string用法的有效值吗?

如果你对两者都回答“是”,那么你会希望使用null。 否则,你不能区分“没有价值”和“空string”之间的区别。

如果您不需要知道是否没有值,那么空string可能更安全,因为它允许您在任何地方使用空检查。

这实际上是C#语言中的一个漏洞。 没有办法定义一个不能为空的string。 这会导致问题如你所描述的那样简单,这迫使程序员做出决定,他们不应该这样做,因为在很多情况下,NULL和String.Empty意味着同样的事情。 反过来,这又会迫使其他程序员必须同时处理NULL和String.Empty,这很烦人。

更大的问题是,数据库允许您定义映射到C#string的字段,但数据库字段可以定义为NOT NULL。 所以,没有办法在SQL Server中使用C#types准确地表示一个varchar(100)NOT NULL字段。

其他语言,如Spec#,也允许这样做。

在我看来,C#无法定义一个不允许为null的string,就像以前无法定义一个允许为null的int一样糟糕。

要完全回答你的问题:我总是使用空string进行默认初始化,因为它更类似于数据库数据types的工作方式。 (编辑:这个语句是非常不清楚的,它应该是这样的:“当NULL是一个多余的状态时,我使用空string作为默认的初始化,如果NULL是一个多余的状态,就像我设置NOT NULL的数据库一样。 ,我的许多DB列被设置为NOT NULL,所以当我把它们放到一个C#string中时,string将是空的或者有一个值,但是永远不会是NULL。换句话说,我只初始化一个string为NULL如果null具有不同于String.Empty的含义的含义,并且我发现该情况不如常见(但这里的人给出了这种情况的合法示例)。“)

我要么设置为“”或空 – 我总是使用String.IsNullOrEmpty检查,所以要么罚款。

但我内心的怪人说,我应该把它设置为空,然后我才有适当的价值…

我总是用string.empty声明string;

这可能是一个错误避免技术(build议或不..)? 由于“”仍然是一个string,你将能够调用它的string函数,如果它是NULL会导致一个exception?

我总是将它们初始化为NULL

总是使用string.IsNullOrEmpty(someString)来检查它的值。

简单。

这取决于实际情况。 在大多数情况下,我使用String.Empty是因为我不想在每次尝试使用string时都进行空检查。 它使代码变得更简单,并且不太可能引入不需要的NullReferenceException崩溃。

我只将string设置为空,当我需要知道它是否已经设置,以及空string是有效的设置它的位置。 在实践中,我发现这些情况很less见。

一个空string是一个值(一个文本,顺便说一句,不会包含任何字母)。 空表示没有价值。

当我希望指出它们不指向或包含实际值时,我将variables初始化为空 – 当意图是无值时。

重申Tomalak响应,请记住,当您将stringvariables分配给初始值为null时,您的variables不再是string对象; 与C#中的任何对象相同。 因此,如果您尝试访问variables的任何方法或属性,并且您认为它是一个string对象,则会得到NullReferenceExceptionexception。

string不是值types,永远不会;-)

空值只能在值可选的情况下使用。 如果该值不是可选的(如“姓名”或“地址”),则该值不应为空。 这适用于数据库以及POCO和用户界面。 空意味着“这个值是可选的,并且当前不存在”。

如果您的字段不是可选的,那么您应该将其初始化为空string。 要将它初始化为null,会使对象进入无效状态(由您自己的数据模型无效)。

就个人而言,我宁愿将string默认为不可空,但是如果我们声明“string?”,则只能为空。 虽然也许这在更深层次上是不可行的或合乎逻辑的; 不确定。

我认为没有理由不使用空值为一个未分配的(或在这个地方在一个程序stream不发生)价值。 如果你想区分,那么== null。 如果你只是想检查一个特定的值,不关心它是空的还是不同的,String.Equals(“XXX”,MyStringVar)没有问题。