C# NET是否有将空字符串解析为string.Empty的方法?
我有一个单行方法,可以将null字符串解析为string.Empty,我认为这可能是一个有用的扩展方法,但我找不到一个有用的方法来实现它 我认为它有用的唯一方法是作为string类上的静态方法,因为它显然不能归因于实例,因为实例为null,这会导致编译器错误。[编辑:编译器错误是由于未初始化变量引起的,我对此进行了错误解释] 我曾考虑将其添加到helper类中,但从可发现性的角度来看,这只会增加不必要的复杂性 我想这个问题分为两部分:C# NET是否有将空字符串解析为string.Empty的方法?,c#,.net,C#,.net,我有一个单行方法,可以将null字符串解析为string.Empty,我认为这可能是一个有用的扩展方法,但我找不到一个有用的方法来实现它 我认为它有用的唯一方法是作为string类上的静态方法,因为它显然不能归因于实例,因为实例为null,这会导致编译器错误。[编辑:编译器错误是由于未初始化变量引起的,我对此进行了错误解释] 我曾考虑将其添加到helper类中,但从可发现性的角度来看,这只会增加不必要的复杂性 我想这个问题分为两部分: NET framework是否有一种将空字符串解析为stri
int hashcode =
FirstValue.ResolveNull().GetHashCode() ^
SecondValue.ResolveNull().GetHashCode() ^
...
十几行文字比以下文字更容易阅读:
int hashcode =
(FirstValue ?? String.Empty).GetHashCode() ^
(SecondValue ?? String.Empty).GetHashCode() ^
...
当我没有显式地将字符串值声明为null,而是依赖于隐式表达式时,我遇到了编译器问题:
string s;
但是,如果您明确定义:
string s = null;
您可以很容易地调用:
s.ResolveNull();
谢谢大家的输入。只需将string.Empty添加到任何字符串变量中,您将保证永远不会得到null
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()
查看您的选项…
这项技术
string b = null + string.Empty;
产生
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
另一个流行的选择:
string b = null ?? string.empty
产生
IL_0001: ldsfld System.String.Empty
IL_0006: stloc.0
还有这个
string b = null + "";
产生这个
IL_0001: ldstr ""
IL_0006: stloc.0
我还是喜欢
string b = null + "";
但实际上,在我看来,当您消化字符串时,您应该准备好处理null,我不认为有任何内置功能。我的第一个想法,也是我经常做的,是使用coalesce操作符:
string s = null;
string x = s ?? string.Empty;
我认为它有用的唯一方法是作为string类上的静态方法,因为很明显,它不能归因于实例,因为实例为null,这将导致运行时错误
C#3.0扩展方法可以在空接收器上调用(因为它们在实践中是静态的),但其行为与实例方法相同。因此,只需将其作为一种扩展方法。someExpressionInvolving(s??)
对字符串感到兴奋是没有意义的。空的与“
”-两者之间的差别可以忽略不计:
Console.WriteLine(ReferenceEquals(string.Empty, "")); // true
扩展方法:
public static class StringExtensions
{
public static String EmptyIfNull(this String instance)
{
return instance ?? String.Empty;
}
}
当然,您也可以轻松地编写实例??String.Empty
在需要使用String.Empty而不是null的地方。我想说,将此作为一种扩展方法来实现,感觉有点像我们瑞典人所说的“到小溪的另一边去取水”。当我需要确保得到的是空字符串而不是空字符串时,我通常只是将其与字符串连接起来。empty
:
string test = CouldReturnNull() ?? string.Empty;
public void SomeMethod(string param)
{
string notNull = param + string.Empty;
}
当然,这可能会导致创建一个额外的字符串实例,但在我遇到的大多数实际情况下,这并不是一个问题。您可以在C#中使用,这就是您的意思吗?还是我误解了
例如
y=String.Empty 没有内置的功能。但您可以使用以下语句为字符串类型编写一个小扩展方法(或静态方法):
string abc = s ?? string.Empty;
返回s??string.Emtpy 根据30秒内的6条回复,是的,常识:Dlol——我知道,我也不是因为错过了null coalescing,而是因为这个特殊的目的,我已经把它写成了丑陋。我想我应该更具体地回答我的问题:我认为不能处理空字符串的代码很难看:-P@AllenLOL-告诉string.GetHashCode(),我没有写它;)String.GetHashCode
无法“处理”null,因为它是一个实例方法,并且实例方法(无论如何,在C#中)一般不应该用null
接收器调用。您关于能够在null上调用扩展方法的观点是100%正确(+1)-但这通常比null合并更费劲。好的,我没想到会这样-你说得对。我实际上并没有给我的字符串赋值null,它只是在实例化后默认为null,所以我得到了一个编译器错误。当我实际声明字符串s=null时;它修复了这个问题-即使值仍然为空。。。奥迪同意,马克——这就是为什么我投票支持第一个提到?
(马特的)的答案。这只是为了指出问题中的错误陈述。Ben,局部变量不会“默认为null”。它们“默认”为未初始化,因此当您尝试使用这样一个变量执行任何操作时,编译器都会抱怨没有给它赋值(或者将其作为参数传递出去,让其他人来做)。这绝对与null
无关。用int
或任何其他值类型(不能是null
)试试,看看它是如何工作的。不需要在这些值上解析null,因为它们的默认值int为0。例如,我只是在字符串值上遇到了问题。Idk为什么任何人只要添加字符串就可以这样做。Empty@Allen-语义上,这非常清楚地表明用户想要一个空字符串而不是null。如果您将空字符串添加到看似已存在的字符串中,则可能有人误解了该代码的实际用途
string abc = s ?? string.Empty;