题
我有一个线法可以解决一null string string.空的,我认为可能是有用的,作为一个扩展方法-但是我不能找到一个有用的方式,使它如此。
只有这样我可以看到它是有用的是作为一个静态的方法上串类,因为很明显,这不能归咎于一个实例作为实例是空和这会导致一个编译器的错误。[编辑:编译的错误,是由于初始化的变量,这是我误解了]
我想添加一个辅助课,但那只是增加了不必要的复杂性,从一个发现的角度来看。
所以这个问题是在两个部分我想:
- 不会的.净框架具有内在的方式解决null string string.空的,这是普通常识,我已经错过了沿途的某个地方?
- 如果没有-没有人知道的一种方式来增加这个方法作为一个静态的延长串类?
干杯先
编辑:
好吧,我想我应该已经更加清楚一点-我已经知道的空coallescing和我使用这个地方在那里我已经有了一个十几个字符串正在检查计算的散列代码。
你可以想象,12线的代码的密切关注各个其他所有含有空coallescing法是不顺眼所以我搬空coallescing作出的一种方法让事情变得更容易容易的在眼睛。这是完美的,然而,它将是一个完美的扩展到串的对象:
int hashcode =
FirstValue.ResolveNull().GetHashCode() ^
SecondValue.ResolveNull().GetHashCode() ^
...
超过一打的线路是一个很容易阅读于:
int hashcode =
(FirstValue ?? String.Empty).GetHashCode() ^
(SecondValue ?? String.Empty).GetHashCode() ^
...
我正在运行为编译器问题时,我并没有明确地宣布我的串值为无但依赖于隐性:
string s;
但是,如果你明确定义:
string s = null;
你可以很容易地呼叫:
s.ResolveNull();
谢谢你的投入。
解决方案
只有这样我可以看到它是有用的是作为一个静态的方法上串类,因为很明显,这不能归咎于一个实例作为实例是空的,这将导致运行时的错误。
C#3.0扩展的方法可以被称为上空接收器(因为它们是静态的做法),但是行为实例的方法。所以只要它扩展的方法。
其他提示
我不认为有任何建立在用于这一点。我第一个想到的,和我做的常常是使用联合操作员:
string s = null;
string x = s ?? string.Empty;
someExpressionInvolving(s??"");
没有一点让你兴奋 string.Empty
vs ""
-有可忽略不计的差异:
Console.WriteLine(ReferenceEquals(string.Empty, "")); // true
扩展的方法:
public static class StringExtensions
{
public static String EmptyIfNull(this String instance)
{
return instance ?? String.Empty;
}
}
当然,你可以很容易地编写 instance ?? String.Empty
在地方在这里你需要使用String.空的,而不是空。
string test = CouldReturnNull() ?? string.Empty;
你可以使用 ??操作员(null-聚结营者) C#-那是什么意思?或者是我被误解了?
例如。
string n = null;
string y = n ?? String.Empty;
y会=String.空;
string abc = s ?? string.Empty;
我要说的是,实施这种扩展的方法的会感觉有点像我们在瑞典的电话 "旅行到另一边的河取水".当我需要确保我得到一个空串而不是空的,我往往只是连接与 string.Empty
:
public void SomeMethod(string param)
{
string notNull = param + string.Empty;
}
当然,这可能会导致额外的串的实例正在建立,但是在大多数实际情况,我已经在这已经不是一个问题。
没有建立在功能。但你可以写一个小小的扩展方法(或静态menthod)的类型字符串声明,如:
回s??string.Emtpy;
只是添加string.空 任何串的变量,你就可能保证永远没空
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()'s
看你的选择...
这种技术
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 + "";
但是真的,海事组织,你应该只是准备处理空的时候你摘要串