代码之家  ›  专栏  ›  技术社区  ›  jhunter

对空合并运算符求反

  •  14
  • jhunter  · 技术社区  · 14 年前

    我有一些字符串需要使用.trim(),但它们可以是空的。如果我能做些像这样的事情,它会更简洁:

    string endString = startString !?? startString.Trim();
    

    如果左边的部分不是空的,基本上返回右边的部分,否则只返回空值。我刚刚使用了三元运算符,但是否有必要为此使用空合并运算符?

    9 回复  |  直到 6 年前
        1
  •  12
  •   kemiller2002    14 年前

    您可以创建一个返回 null 当它试图修剪值时。

    public String TrimIfNotNull(this string item)
    {
       if(String.IsNullOrEmpty(item))
         return item;
       else
        return item.Trim();
    }
    

    注意,不能将其命名为trim,因为扩展方法不能重写实例方法。

        2
  •  12
  •   user7116 hacken    14 年前

    非规格: 我不喜欢,但你可以使用:

    string endString = (startString ?? String.Empty).Trim();
    

    具体来说,最好是像@kevin's这样的扩展方法:

    string endString = (startString == null ? null : startString.Trim());
    
        3
  •  4
  •   Community Egal    7 年前
    string endString = string.IsNullOrEmpty(startString) ? startString : startString.Trim();
    

    尽管我也已经开始编写一个名为“safetrim”的字符串扩展方法,它可以在一个方法中完成您所描述的,而不必每次都使用这个方法。退房 Kevin's respone 用于代码。

    编辑 :哇,我有各种各样的向后的、错误命名的变量和颠倒的三元运算符,这比我写一个扩展方法和代码检查好得多!

        4
  •  1
  •   AxelEckenberger    14 年前

    使用

    string endString = (startString ?? "").Trim();
    

    如果startstring为空,则使用empy字符串。然而,这确实是 返回空值的时间 endString 是空的。

        5
  •  1
  •   Dai    11 年前

    对不起,死灵术,但我也遇到了同样的问题,我用lambda操作解决了这个问题。它不是最漂亮的,但它使我的代码简洁。

    很遗憾,C不支持静态导入或单个函数导入,但无论如何:

    在某个地方定义此函数:

    private static TResult N<TParent,TResult>(TParent parent, Func<TParent,TResult> operation) {
        if( parent == null ) return default(TResult);
        return operation( parent );
    }
    

    然后在示例中使用它:

    String endString = N(startString, s => s.Trim());
    

    这个 N 函数返回 null 如果第一个参数为空,否则它将以值作为参数计算指定的lambda函数。

    当然,你可以像这样筑巢。例如,安全地取消对长链的引用,例如

    String someValue = someObject.SomeProperty.SomeOtherProperty.SomeMethod().SomeFinalProperty;
    

    如果这些属性或方法中的任何一个返回空值,则必须在所有地方插入空值检查,或者可以这样做:

    String someValue = N(N(N(N(someObject, o => o.SomeProperty), o => o.SomeOtherProperty), o => o.SomeMethod()), o => o.SomeFinalProperty);
    

    正如我所说,它不是最漂亮的。)

    你可以通过 n 的一种扩展方法 System.Object ,像这样:

    String someValue = someObject.N( o => o.SomeProperty ).N( o => o.SomeOtherProperty ).N( o => o.SomeMethod() ).N( o => o.SomeFinalProperty );
    

    …我觉得这要整洁得多。

        6
  •  0
  •   Heinzi    14 年前

    以下内容不传播空值,但它接受空值作为参数,并在这种情况下返回空字符串。

    using Microsoft.VisualBasic;  // you need to add a reference to Microsoft.VisualBasic.dll
    
        ...
        string endString = Strings.Trim(startString);
        ...
    

    鸭子和跑步…

        7
  •  0
  •   Alfred Myers    14 年前

    创建一个方法,例如:

    string MyTrim(string a) {
        if (a != null) {
            a = a.Trim();
        }
        return a;
    }
    
        8
  •  0
  •   Igal Tabachnik    14 年前

    作为补充说明,如果您使用.NET 4,则有一种新的方便方法 String.IsNullOrWhiteSpace 你可以用。

        9
  •  0
  •   Steven Rumbalski    6 年前

    从C 6.0(.NET Framework 4.6/Visual Studio 2015)开始,您可以使用 null-conditional member access :

     string? endString = startString?.Trim();