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

Does .NET have a way of resolving a null string to String.Empty?

我有一个将空字符串解析为string.empty的单行方法,我认为这可能是一个扩展方法——但我找不到一个有效的方法来实现它。

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

我考虑过将它添加到一个助手类中,但从可发现性的角度来看,这只是增加了不必要的复杂性。

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

  • .NET框架是否有一种内置的方法将空字符串解析为string.empty,这是我一路上遗漏的常见知识?
  • 如果没有-有人知道如何将此方法添加为字符串类的静态扩展吗?
  • 提前干杯

    编辑:

    好吧,我想我应该更清楚一点——我已经很清楚空协同作用了,我在一个地方使用它,在这个地方我已经检查了十几个字符串来计算散列代码。

    正如您可以想象的那样,12行代码紧密地跟随在一起,它们都包含空的coallescing语法,这让人大吃一惊,所以我将空的coalscing操作移到了一个方法中,以使对眼睛的操作更简单。不过,这是对字符串对象的完美扩展:

    1
    2
    3
    4
    int hashcode =
    FirstValue.ResolveNull().GetHashCode() ^
    SecondValue.ResolveNull().GetHashCode() ^
    ...

    超过12行的内容比以下内容更容易阅读:

    1
    2
    3
    4
    int hashcode =
    (FirstValue ?? String.Empty).GetHashCode() ^
    (SecondValue ?? String.Empty).GetHashCode() ^
    ...

    当我没有将字符串值显式声明为空,而是依赖于隐式声明时,我遇到了编译器问题:

    1
     string s;

    但是,如果您明确定义:

    1
    string s = null;

    您可以很容易地拨打:

    1
    s.ResolveNull();

    谢谢大家的意见。


    我觉得这里面没有什么东西。我的第一个想法,也是我经常做的,是使用coalesce操作符:

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


    The only way I could see it being useful is as a static method on the string class because obviously it can't be attributed to an instance as the instance is null and this would cause a runtime error.

    C 3.0扩展方法可以在空接收器上调用(因为实际上它们是静态的),但其行为与实例方法相同。所以把它变成一个扩展方法。


    有什么表达意愿?"?"

    对于string.Empty"",没有什么值得兴奋的地方——两者之间的差异可以忽略不计:

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


    扩展方法:

    1
    2
    3
    4
    5
    6
    7
    public static class StringExtensions
    {
        public static String EmptyIfNull(this String instance)
        {
            return instance ?? String.Empty;
        }
    }

    当然,在需要使用string.empty而不是null的地方也可以很容易地编写instance ?? String.Empty


    1
    string abc = s ?? string.Empty;

    你能用吗??C中的运算符(空合并运算符)-这就是您的意思吗?还是我误解了?

    如。

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

    y将=string.empty;


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

    没有内置函数。但是您可以使用如下语句为字符串类型编写一个小的扩展方法(或静态方法):

    返回S?弦?Emtpy;


    我想说,将其作为一种扩展方法来实现,会有点像我们在瑞典所说的"到小溪的另一边去取水"。当我需要确保得到一个空字符串而不是空字符串时,我通常只与string.Empty连接:

    1
    2
    3
    4
    public void SomeMethod(string param)
    {
        string notNull = param + string.Empty;
    }

    当然,这可能会导致创建一个额外的字符串实例,但在大多数实际情况下,我所处的位置并不是问题。


    只要将string.empty添加到任何字符串变量中,就可以保证永远不会得到空值。

    1
    2
    3
    4
    5
    6
    7
    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()是

    看看你的选择…

    这种技术

    1
    string b = null + string.Empty;

    生成

    1
    2
    3
    4
    5
    6
    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

    另一个流行的选择是:

    1
    string b = null ?? string.empty

    生成

    1
    2
    IL_0001:  ldsfld      System.String.Empty
    IL_0006:  stloc.0

    而这

    1
    string b = null +"";

    生成此

    1
    2
    IL_0001:  ldstr      ""
    IL_0006:  stloc.0

    我还是喜欢

    1
    string b = null +"";

    但实际上,在我看来,消化字符串时应该准备好处理空值。