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

如何为可能为空的对象执行字符串?

  •  76
  • codymanix  · 技术社区  · 14 年前

    有没有一种简单的方法可以做到以下几点:

    String s = myObj == null ? "" : myObj.ToString();
    

    我知道我可以做到以下几点,但我真的认为这是一个黑客:

    String s = "" + myObj;
    

    12 回复  |  直到 14 年前
        1
  •  161
  •   Andrew Hanlon    5 年前

    C#6.0编辑:

    有了C#6.0,我们现在可以拥有一个简洁的、无需强制转换的原始方法:

    string s = myObj?.ToString() ?? "";
    

    string s = $"{myObj}";
    

    原始答案:

    String s = (myObj ?? String.Empty).ToString();
    

    String s = (myObjc ?? "").ToString()
    

    更加简洁。

    String s = (myObjc ?? (Object)"").ToString()
    String s = ((Object)myObjc ?? "").ToString()
    

    因此,虽然它可能看起来优雅,但演员阵容几乎总是必要的,在实践中并不是那么简洁。

    如其他地方所建议的,我建议使用一种扩展方法来使其更清晰:

    public static string ToStringNullSafe(this object value)
    {
        return (value ?? string.Empty).ToString();
    }
    
        2
  •  40
  •   Holstebroe    14 年前
    string.Format("{0}", myObj);
    

        3
  •  15
  •   Rob Gilliam    10 年前

    如果Convert.ToString()对此有一个适当的重载,那就太好了。

    有一个 Convert.ToString(Object value) 自.Net 2.0(在被问到这个问题之前大约5年)以来,它似乎完全符合您的要求:

    http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx

    我是不是遗漏了/误解了一些很明显的东西?

        4
  •  13
  •   Pieter van Ginkel    14 年前

    通过扩展方法,您可以完成以下任务:

    public static class Extension
    {
        public static string ToStringOrEmpty(this Object value)
        {
            return value == null ? "" : value.ToString();
        }
    }
    

    以下操作不会向屏幕写入任何内容,也不会引发异常:

            string value = null;
    
            Console.WriteLine(value.ToStringOrEmpty());
    
        5
  •  7
  •   steinar Justin CI    14 年前

    String s = myObj == null ? "" : myObj.ToString();
    

    无论如何都是个黑客。我认为这是一个清晰代码的好例子。很明显你想要达到什么,你期望的是零。

    更新:

    我知道你不是说这是个黑客。但问题是你认为这条路不是条路。在我看来,这绝对是最明确的解决方案。

        6
  •  4
  •   herzmeister    14 年前
    string s = String.Concat(myObj);
    

        7
  •  2
  •   Serkan Hekimoglu    14 年前

    实际上我不明白你想做什么。据我所知,你可以用另一种方式来编写这段代码。你到底问不问?你能再解释一下吗?

    string s = string.Empty;
        if(!string.IsNullOrEmpty(myObj))
        {
        s = myObj.ToString();
        }
    
        8
  •  2
  •   jaydel    14 年前

    我可能会为我的答案而感到恼火,但不管怎么说:

    字符串s=“” 如果(myObj!=空){ }

    使用三元运算符在性能方面是否有回报?我不太清楚。

        9
  •  2
  •   jahu    9 年前

    我也有同样的问题,只需将对象转换成字符串就解决了。这也适用于空对象,因为字符串可以为空。除非您绝对不希望有空字符串,否则这应该可以正常工作:

    string myStr = (string)myObj; // string in a object disguise or a null
    
        10
  •  2
  •   drzaus tranceporter    7 年前

    一些(速度)性能测试总结了各种选项,并不是说它真的很重要#微观优化(使用 linqpad extension

    选项

    void Main()
    {
        object objValue = null;
        test(objValue);
        string strValue = null;
        test(strValue);
    }
    
    // Define other methods and classes here
    void test(string value) {
        new Perf<string> {
            { "coallesce", n => (value ?? string.Empty).ToString() },
            { "nullcheck", n => value == null ? string.Empty : value.ToString() },
            { "str.Format", n => string.Format("{0}", value) },
            { "str.Concat", n => string.Concat(value) },
            { "string +", n => "" + value },
            { "Convert", n => Convert.ToString(value) },
        }.Vs();
    }
    
    void test(object value) {
        new Perf<string> {
            { "coallesce", n => (value ?? string.Empty).ToString() },
            { "nullcheck", n => value == null ? string.Empty : value.ToString() },
            { "str.Format", n => string.Format("{0}", value) },
            { "str.Concat", n => string.Concat(value) },
            { "string +", n => "" + value },
            { "Convert", n => Convert.ToString(value) },
        }.Vs();
    }
    

    也许重要的是要指出 Convert.ToString(...)

    结果

    • 空检查1.00x1221个刻度(0.1221毫秒)[每10公里重复,1.221-05毫秒]
    • 煤泥1.14 x 1387滴答声(0.1387毫秒)[每10公里重复,1.387E-05毫秒]
    • 字符串+1.16x1415个计时(0.1415毫秒)[以10公里为单位,每分钟1.415E-05毫秒]
    • str.Concat 1.16x1420滴答声(0.142毫秒)[每10公里重复,1.42E-05毫秒]
    • str.格式5.45x6655滴答声(0.6655ms)[以10K次为单位,每分钟6.655E-05ms]

    • 空检查1.00x1190个计时点(0.119毫秒)[以10公里为单位,每分钟1.19E-05毫秒]
    • 字符串+1.04x1239个刻度(0.1239ms)[以10K次为单位,每分钟1.239E-05ms]
    • 煤泥1.20x1423滴答声(0.1423ms)[以10K次为单位,每分钟1.423E-05ms]
    • str.Concat 4.57x5444滴答声(0.5444毫秒)[每10公里重复,5.444E-05毫秒]
        11
  •  1
  •   jp2code    14 年前

    霍尔斯特布罗的评论将是你最好的回答:

    string s = string.Format("{0}", myObj);
    

    myObj 为空,则Format在其中放置空字符串值。

    它还满足您的单行要求,并且易于阅读。

        12
  •  0
  •   Sascha    5 年前

    尽管这是一个老问题,OP要求C#我还是想为那些使用VB.Net而不是C#的人分享一个VB.Net解决方案:

    Dim myObj As Object = Nothing
    Dim s As String = If(myObj, "").ToString()
    
    myObj = 42
    s = If(myObj, "").ToString()