我总是将我的字符串初始化为NULL,认为NULL表示没有值,""或String.Empty是一个有效值.我最近看到了更多代码示例,其中String.Empty被视为默认值或不表示任何值.这让我感到很奇怪,在c#中新添加的可空类型似乎我们通过不使用NULL来表示"无值"来向后调整字符串.
您使用什么作为默认初始化程序?为什么?
编辑:根据答案,我进一步思考
避免错误处理如果值不应为null,为什么它NULL
首先设置为?也许最好在发生错误的位置识别错误,而不是在代码库的其余部分覆盖错误?
避免空检查如果您厌倦了在代码中进行空检查,那么抽象空检查是不是更好?也许包装(或扩展!)字符串方法以使它们NULL
安全吗?如果你经常使用String.Empty
并且null正好进入你的系统会发生什么,你是否开始添加NULL
检查?
我忍不住回到懒惰的意见.如果你使用''而不是null
在他的数据库中使用',那么任何DBA都会狠狠地打你九种方式.我认为同样的原则适用于编程,并且应该有人打击那些使用String.Empty
而不是NULL
代表没有价值的人.
相关问题
在C#中,我应该使用string.Empty还是String.Empty或""?
String.Empty和""之间有什么区别
空列或空字符串表示表列中没有数据?
Adam Liss.. 110
+1用于区分"空"和NULL.我同意"空"应该表示"有效,但空白","空"应表示"无效".
所以我会这样回答你的问题:
当我想要一个可能会或可能不会更改的有效默认值时为空,例如,用户的中间名.
如果后续代码未明确设置值,则出现错误时为NULL.
+1用于区分"空"和NULL.我同意"空"应该表示"有效,但空白","空"应表示"无效".
所以我会这样回答你的问题:
当我想要一个可能会或可能不会更改的有效默认值时为空,例如,用户的中间名.
如果后续代码未明确设置值,则出现错误时为NULL.
根据MSDN:
通过使用
Empty
值而不是初始化字符串null
,可以减少NullReferenceException
发生的可能性.
IsNullOrEmpty()
尽管如此,总是使用是好的做法.
为什么要完全初始化字符串?您不必初始化变量在声明之一,国际海事组织,你应该只这样做,当你将值是在代码块的上下文中有效.
我看到了很多:
string name = null; // or String.Empty if (condition) { name = "foo"; } else { name = "bar"; } return name;
不初始化为null将同样有效.此外,通常您需要分配值.通过初始化为null,您可能会错过未分配值的代码路径.像这样:
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,编译器将生成错误,指出并非所有代码路径都分配值.当然,这是一个非常简单的例子......
Matthijs
对于大多数实际上不是字符串处理软件的软件,程序逻辑不应该依赖于字符串变量的内容.每当我在程序中看到这样的东西时:
if (s == "value")
我感觉很糟糕.为什么这个方法中有字符串文字?什么设置s
?它知道逻辑取决于字符串的值吗?是否知道必须小写才能工作?我应该通过更改它来修复它String.Compare
吗?我应该创建Enum
并解析它吗?
从这个角度来看,人们可以使用非常简单的代码哲学:尽可能避免检查字符串的内容.比较字符串String.Empty
实际上只是将它与文字进行比较的特殊情况:除非你真的必须这样做,否则它应该避免做.
知道了这一点,当我在代码库中看到类似的内容时,我不会眨眼:
string msg = Validate(item); if (msg != null) { DisplayErrorMessage(msg); return; }
我知道Validate
永远不会回来String.Empty
,因为我们编写了比这更好的代码.
当然,世界其他地方并不像这样.当您的程序处理用户输入,数据库,文件等时,您必须考虑其他原则.在那里,你的代码的工作是在混乱上强加秩序.这个顺序的一部分是知道空字符串何时应该意味着String.Empty
何时应该意味着什么null
.
(为了确保我没有说出我的屁股,我只是在我们的代码库中搜索了`String.IsNullOrEmpty'.它的所有54次出现都在处理用户输入的方法中,从Python脚本返回值,检查从外部API等)
这取决于.
您是否需要能够判断是否缺少值(是否可能无法定义)?
空字符串是否是该字符串用法的有效值?
如果您对两者都回答"是",那么您将要使用null.否则你无法区分"无值"和"空字符串"之间的区别.
如果您不需要知道是否没有值,那么空字符串可能更安全,因为它允许您在任何使用它的地方跳过空值检查.
这实际上是C#语言中的一个漏洞.无法定义不能为null的字符串.这会导致问题像您所描述的那样简单,这迫使程序员做出他们不应该做出的决定,因为在很多情况下,NULL和String.Empty意味着相同的事情.反过来,这可能会迫使其他程序员必须同时处理NULL和String.Empty,这很烦人.
更大的问题是数据库允许您定义映射到C#字符串的字段,但数据库字段可以定义为NOT NULL.因此,没有办法使用C#类型准确地表示SQL Server中的varchar(100)NOT NULL字段.
其他语言,例如Spec#,允许这样做.
在我看来,C#无法定义不允许null的字符串与之前无法定义允许null的int一样糟糕.
完全回答你的问题:我总是使用空字符串进行默认初始化,因为它更类似于数据库数据类型的工作方式.(编辑:这个陈述非常不清楚.它应该是"我使用空字符串进行默认初始化,当NULL是一个多余的状态时,就像我将数据库列设置为NOT NULL一样,如果NULL是一个多余的状态." ,我的许多数据库列都设置为NOT NULL,所以当我将它们带入C#字符串时,字符串将为空或具有值,但永远不会为NULL.换句话说,我只将字符串初始化为NULL如果null的含义与String.Empty的含义不同,我发现这种情况不常见(但是这里的人已经给出了这种情况的合法例子).")