2009-08-06 23 views
5

我有一行方法,将空字符串解析为string.Empty,我认为这可能对扩展方法有用 - 但我找不到一个有用的方法来实现它。.NET是否有一种将空字符串解析为String.Empty的方法?

我可以看到它有用的唯一方法是作为字符串类的静态方法,因为显然它不能归因于实例,因为实例为空,这会导致编译器错误。 [编辑:编译器错误是由于未初始化的变量,我误解了]

我想将其添加到辅助类,但这只是从发现性的角度增加了不必要的复杂性。

所以这个问题是两个部分,我想:

  1. 是否.NET框架已经内置在解决一个空字符串的String.Empty的方式是,我沿着某处错过常识办法?
  2. 如果它不 - 没有人知道一种方法来添加此方法作为字符串类的静态扩展吗?

干杯提前

编辑:

好吧,我想我应该已经多一点明确的 - 我已经清楚地知道空coallescing的,我是在一个地方使用此我有十几个字符串被检查用于计算散列码。你可以想象,12行代码紧密地跟在一起,都包含null coallescing语法,这是一个盲点,所以我将null 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(); 

感谢所有为您的输入。

+0

根据30秒内的6条回复,是的,常识。 :D – 2009-08-06 20:14:27

+0

大声笑 - 这并不是说我错过了傻傻的笑话,我知道,为了这个特定的目的,它已经把它写成丑陋的。我想我应该已经更具体的我的问题:D – BenAlabaster 2009-08-06 20:25:05

+1

我认为不能处理空字符串的代码是丑陋的:-P – 2009-08-06 20:30:31

回答

6

我可以看到它是有用的唯一方法是在串类,因为显然它不可能是一个静态方法归因于实例,因为实例为空,这会导致运行时错误。

可以在null接收者上调用C#3.0扩展方法(因为它们在实践中是静态的),但是其行为与实例方法相同。所以,只要将其作为扩展方法即可。

+4

你能够在null上调用扩展方法的观点是100%正确的(+1) - 但它通常会比null-coalescing更努力。 – 2009-08-06 20:16:38

+0

好吧,我没有看到那样 - 你说得对。我实际上没有将空值赋给我的字符串,它只是在实例化后默认为空,所以我得到一个编译器错误。当我实际声明字符串s = null;它解决了问题 - 尽管价值仍然是空的......奇怪的 – BenAlabaster 2009-08-06 20:17:53

+0

我同意,马克 - 这就是为什么我实际投了第一个答案,提到'??(马特)。这只是为了指出问题中的错误陈述。 – 2009-08-06 20:39:27

0

只需添加的String.Empty任何字符串变量,你会保证永远不会空

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 + ""; 

不过说真的,海事组织,你应该准备当你消化的字符串处理空

+0

哇,真的,有投票权吗? – 2009-08-06 20:33:58

24

我不认为这里有什么内置的。我首先想到的,我经常做什么,是用聚结操作:

string s = null; 
string x = s ?? string.Empty; 
+0

Idk为什么有人会这样做,他们可以只添加字符串.Empty – 2009-08-06 20:17:01

+3

@Allen - 语义上,这使得它完全清楚,用户需要一个空字符串而不是null。如果您将空字符串添加到似乎是现有字符串的字符串中,某人可能会误解该代码应该做什么 – 2009-08-06 20:19:45

+0

*耸耸肩*我在帖子中显示了IL,它们是相同的,所以它的风格,国际海事组织,我的解决方案读取更清晰,但这是主观 – 2009-08-06 20:26:06

4

someExpressionInvolving(s ??“”);

没有一点感到兴奋string.Empty VS "" - 有微小差别:

Console.WriteLine(ReferenceEquals(string.Empty, "")); // true 
+0

我的静态方法使用null coallescing - 我只是想让事情更具可读性,因为我有十几行检查不同的字段,它看起来很丑陋。 – BenAlabaster 2009-08-06 20:19:39

3

扩展方法:

public static class StringExtensions 
{ 
    public static String EmptyIfNull(this String instance) 
    { 
     return instance ?? String.Empty; 
    } 
} 
当然

,你可以很容易地写在地方instance ?? String.Empty你需要使用String.Empty而不是null。

+0

我在计算散列码的地方使用它,唉,我有一打字符串字段可能为空,它看起来很丑。我认为它会看起来更漂亮,因为它是一个静态的字符串扩展方法 - 即string.ResolveNull(stringValue).GetHashCode() – BenAlabaster 2009-08-06 20:23:49

1
string test = CouldReturnNull() ?? string.Empty; 
0

我要说的是,实现这个作为一个扩展方法会觉得有点像我们在瑞典叫“前往小河的另一边打水”。当我需要保证我得到一个空字符串,而不是空我常常只是string.Empty拼接:

public void SomeMethod(string param) 
{ 
    string notNull = param + string.Empty; 
} 

当然,这可能会导致额外的字符串实例被创建,但在大多数现实世界的情况下,我一直在这没有问题。

1

你可以在C#中使用?? Operator (null-coalescing operator) - 这是你的意思吗?或者我误解了?

例如。

string n = null; 
string y = n ?? String.Empty; 

y would = String.Empty;

1
string abc = s ?? string.Empty; 
0

没有构建功能。但是你可以写一个字符串类型的小扩展方法(或者一个静态的menthod),如下所示:

return s ?? string.Emtpy;

+0

它有点多功夫,因为他在谈论分配而不是检查。但通常是我尝试使用它 – 2009-08-06 20:25:09

相关问题