默认string初始化:NULL还是空?
我总是把我的string初始化为NULL,并认为NULL意味着缺less一个值,而“”或String.Empty是一个有效的值。 我已经看到了更多的例子CodeGo.net,其中String.Empty被认为是默认值或代表没有价值。 这让我觉得奇怪,在c#中添加了新的可空types,好像我们正在用string向后迈进,而不使用NULL来表示“无值”。
你使用什么作为默认的初始化器,为什么?
编辑:基于这个答案,我进一步思考
-
避免error handling如果值不能为空,为什么它首先被设置为
NULL
? 也许最好是在发生错误的地方找出错误,而不是在整个代码库中覆盖错误? -
避免空值检查如果你已经厌倦了在代码中进行空值检查,抽象空检查不是更好吗? 也许包装(或扩展!)的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)没有问题。