Does .NET have a way of resolving a null string to String.Empty?
我有一个将空字符串解析为string.empty的单行方法,我认为这可能是一个扩展方法——但我找不到一个有效的方法来实现它。
我唯一能看到它有用的方法是作为字符串类上的静态方法,因为很明显,它不能归于实例,因为实例为空,这会导致编译器错误。[编辑:编译器错误是由于未初始化的变量导致的,我对此进行了错误解释]
我考虑过将它添加到一个助手类中,但从可发现性的角度来看,这只是增加了不必要的复杂性。
我想这个问题分为两部分:
提前干杯
编辑:
好吧,我想我应该更清楚一点——我已经很清楚空协同作用了,我在一个地方使用它,在这个地方我已经检查了十几个字符串来计算散列代码。
正如您可以想象的那样,12行代码紧密地跟随在一起,它们都包含空的coallescing语法,这让人大吃一惊,所以我将空的coalscing操作移到了一个方法中,以使对眼睛的操作更简单。不过,这是对字符串对象的完美扩展:
1 2 3 4 | int hashcode = FirstValue.ResolveNull().GetHashCode() ^ SecondValue.ResolveNull().GetHashCode() ^ ... |
超过12行的内容比以下内容更容易阅读:
1 2 3 4 | int hashcode = (FirstValue ?? String.Empty).GetHashCode() ^ (SecondValue ?? String.Empty).GetHashCode() ^ ... |
当我没有将字符串值显式声明为空,而是依赖于隐式声明时,我遇到了编译器问题:
1 | string s; |
但是,如果您明确定义:
1 | string s = null; |
您可以很容易地拨打:
1 | s.ResolveNull(); |
谢谢大家的意见。
我觉得这里面没有什么东西。我的第一个想法,也是我经常做的,是使用coalesce操作符:
1 2 | string s = null; string x = s ?? string.Empty; |
The only way I could see it being useful is as a static method on the string class because obviously it can't be attributed to an instance as the instance is null and this would cause a runtime error.
C 3.0扩展方法可以在空接收器上调用(因为实际上它们是静态的),但其行为与实例方法相同。所以把它变成一个扩展方法。
有什么表达意愿?"?"
对于
1 | Console.WriteLine(ReferenceEquals(string.Empty,"")); // true |
扩展方法:
1 2 3 4 5 6 7 | public static class StringExtensions { public static String EmptyIfNull(this String instance) { return instance ?? String.Empty; } } |
当然,在需要使用string.empty而不是null的地方也可以很容易地编写
1 | string abc = s ?? string.Empty; |
你能用吗??C中的运算符(空合并运算符)-这就是您的意思吗?还是我误解了?
如。
1 2 | string n = null; string y = n ?? String.Empty; |
y将=string.empty;
1 | string test = CouldReturnNull() ?? string.Empty; |
没有内置函数。但是您可以使用如下语句为字符串类型编写一个小的扩展方法(或静态方法):
返回S?弦?Emtpy;
我想说,将其作为一种扩展方法来实现,会有点像我们在瑞典所说的"到小溪的另一边去取水"。当我需要确保得到一个空字符串而不是空字符串时,我通常只与
1 2 3 4 | public void SomeMethod(string param) { string notNull = param + string.Empty; } |
当然,这可能会导致创建一个额外的字符串实例,但在大多数实际情况下,我所处的位置并不是问题。
只要将string.empty添加到任何字符串变量中,就可以保证永远不会得到空值。
1 2 3 4 5 6 7 | string a = null; string b = null + string.Empty; string c ="a" + string.Empty; (a == string.Empty).Dump(); // False (b == string.Empty).Dump(); // True (c =="a").Dump(); // True |
我把这个扔进了linqpad,因此.dump()是
看看你的选择…
这种技术
1 | string b = null + string.Empty; |
生成
1 2 3 4 5 6 | IL_0001: ldsfld System.String.Empty IL_0006: dup IL_0007: brtrue.s IL_000F IL_0009: pop IL_000A: ldstr "" IL_000F: stloc.0 |
另一个流行的选择是:
1 | string b = null ?? string.empty |
生成
1 2 | IL_0001: ldsfld System.String.Empty IL_0006: stloc.0 |
而这
1 | string b = null +""; |
生成此
1 2 | IL_0001: ldstr "" IL_0006: stloc.0 |
我还是喜欢
1 | string b = null +""; |
但实际上,在我看来,消化字符串时应该准备好处理空值。