什么是最好的转换方式:Convert.ToString()还是与空字符串拼接?

3
var item = "" + dr["someString"];

或者

var item = Convert.ToString(dr["somestring"]);

以上示例的性能影响是什么?
2个回答

8
如何:
var item = (string)dr["someString"] ?? "";

这种方法避免了不必要的字符串拼接、虚函数调用以及避免了在空引用上调用方法的风险。在这个上下文中,dr 的含义不太清楚;如果它是一个数据读取器(例如 IDataReader),你可能需要:

int index = dr.GetOrdinal("someString");
var item = dr.IsDBNull(index) ? "" : dr.GetString(index);

或者在 DataTable 的情况下,涉及到 DataRow.IsNull


在这个例子中,它是一个 DataRow。 - Leigh Ciechanowski
@Leigh 当然,我本来就不喜欢 DBNull,但在 DataRow 的上下文中,你可以使用 dr.IsNull(...)。这不会改变答案,但是一些相关注释可能会让你感兴趣。 - Marc Gravell
@Leigh 顺便提一下,这也显示了在问题中包含所有相关上下文的重要性;在这种情况下,dr 的定义非常重要,因此在问题中自愿提供这些信息会很有用;p - Marc Gravell
很酷,所以我可以得出结论,将对象转换为字符串并检查其是否为空对性能比仅将对象与空字符串连接要好? - Leigh Ciechanowski
@LeighCiechanowski 嗯,concat 涉及到了额外的不必要的步骤 - 但是,在 DataRow 的情况下,它不会是 null,而是 DbNull,这需要更多的工作。 - Marc Gravell
嗯,代码看起来不太易读。现在我有了 dr.IsNull("someString") ? "" :(string)dr["someString"] 这个选项,与 "" + dr["someString"] 相比,它似乎不那么易读。虽然我很想选择后者,但除非对性能有影响,否则我并不担心性能问题......因为这不会循环或其他什么,所以我只是好奇。 - Leigh Ciechanowski

2

dr["someString"].ValueOrEmpty()有什么问题吗?

至于您最初的问题,性能不会有影响。我向您保证,有几个其他可以优化的领域可以获得更好的性能增益。

编写最易读的代码。在被证明需要优化之前,请勿进行优化。

更新:

public static class StringExtensions
{
    public static string ValueOrEmpty(this object obj)
    {
        return obj == null ? "" : obj.ToString();
    }
}

是的,还是那样做最好? - Leigh Ciechanowski
@Mark,如果dr是一个DataRow,那么dr["someThing"]会返回DBNull而不是null吗? - zmbq
@zmbq 这完全取决于 dr 是什么,问题中并不清楚。我其实想知道它是否是“数据读取器”,并且在我的答案中画了类似的东西。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接