.NET是否有办法将空字符串解析为String.Empty?

时间:2009-08-06 20:09:46

标签: c# .net

我有一个单行方法将空字符串解析为string.Empty,我认为它可能作为扩展方法很有用 - 但我找不到一种有用的方法来实现它。

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

我考虑过将它添加到帮助程序类中,但这只会从可发现性角度增加不必要的复杂性。

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

  1. .NET框架是否有内置的方法将空字符串解析为string.Empty,这是我在路上某处遗漏的常识?
  2. 如果没有 - 有没有人知道将此方法添加为字符串类的静态扩展的方法?
  3. 提前干杯

    编辑:

    好吧,我想我应该更清楚一点 - 我已经清楚地意识到无效的煤炭,而且我正在一个地方使用它,我已经检查了十几个字符串来计算哈希码。

    正如你可以想象的那样,紧跟在一起的12行代码都包含了null的运算语法,所以我将null的运算操作移到了一个方法上,让眼睛更方便。然而,这是完美的,它将是字符串对象的完美扩展:

    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();
    

    感谢大家的投入。

10 个答案:

答案 0 :(得分:24)

我认为没有内置任何东西。我的第一个想法,也就是我经常做的是使用合并算子:

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

答案 1 :(得分:6)

  

我能看到它有用的唯一方法是作为字符串类的静态方法,因为很明显它不能归因于实例,因为实例为null,这会导致运行时错误。

可以在null接收器上调用C#3.0扩展方法(因为它们在实践中是静态的),但表现为实例方法。所以只需将其作为扩展方法。

答案 2 :(得分:4)

someExpressionInvolving(s ??“”);

string.Empty vs ""感到兴奋是没有意义的 - 差别可以忽略不计:

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

答案 3 :(得分:3)

扩展方法:

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

当然,您可以在需要使用String.Empty而不是null的地方轻松编写instance ?? String.Empty

答案 4 :(得分:1)

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

答案 5 :(得分:1)

您可以在C#中使用?? Operator (null-coalescing operator) - 这是什么意思?还是我误解了?

例如

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

y will = String.Empty;

答案 6 :(得分:1)

string abc = s ?? string.Empty;

答案 7 :(得分: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 + "";

但实际上,IMO,你应该准备好在消化字符串时处理null

答案 8 :(得分:0)

我会说实现这个作为一种扩展方法会让我觉得有点像我们瑞典人称之为“前往小溪的另一边取水”。当我需要确保我得到一个空字符串而不是null时,我经常只与string.Empty连接:

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

当然,这可能会导致创建一个额外的字符串实例,但在大多数现实情况下,我一直在这里不是一个问题。

答案 9 :(得分:0)

没有为此功能构建。但是您可以为字符串类型编写一个小扩展方法(或静态方法),其语句如下:

返回s ?? string.Emtpy;