C# NET是否有将空字符串解析为string.Empty的方法?

C# NET是否有将空字符串解析为string.Empty的方法?,c#,.net,C#,.net,我有一个单行方法,可以将null字符串解析为string.Empty,我认为这可能是一个有用的扩展方法,但我找不到一个有用的方法来实现它 我认为它有用的唯一方法是作为string类上的静态方法,因为它显然不能归因于实例,因为实例为null,这会导致编译器错误。[编辑:编译器错误是由于未初始化变量引起的,我对此进行了错误解释] 我曾考虑将其添加到helper类中,但从可发现性的角度来看,这只会增加不必要的复杂性 我想这个问题分为两部分: NET framework是否有一种将空字符串解析为stri

我有一个单行方法,可以将null字符串解析为string.Empty,我认为这可能是一个有用的扩展方法,但我找不到一个有用的方法来实现它

我认为它有用的唯一方法是作为string类上的静态方法,因为它显然不能归因于实例,因为实例为null,这会导致编译器错误。[编辑:编译器错误是由于未初始化变量引起的,我对此进行了错误解释]

我曾考虑将其添加到helper类中,但从可发现性的角度来看,这只会增加不必要的复杂性

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

  • NET framework是否有一种将空字符串解析为string.Empty的内置方法,这是我在过程中遗漏的常识
  • 如果没有-有人知道如何将此方法添加为string类的静态扩展吗
  • 提前欢呼

    编辑:

    好吧,我想我应该说得更清楚一点——我已经很清楚null coalescing,我在一个地方使用了它,在那里我有十几个字符串被检查以计算哈希代码

    正如您所想象的,12行相互紧跟的代码都包含null coalescing语法,这是一个令人讨厌的问题,因此我将null coalescing操作移到了一个方法中,使事情变得更简单。这是完美的,但是,它将是字符串对象的完美扩展:

    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;