【问题标题】:.ToString(), (string), or as String. When to use what?.ToString()、(string) 或 String。什么时候用什么?
【发布时间】:2011-02-10 19:30:58
【问题描述】:

我遇到了一个困扰我的错误。我有 JObject,我认为它可以用

obj["role"].ToString()

字符串在那里,一切都在那里。最后的办法是改成

(string)obj["role"] 

只是想看看会发生什么并且它有效。我的问题是我如何知道何时使用 .ToString() 而不是 (string) 而不是“as String”。

【问题讨论】:

    标签: c# .net asp.net asp.net-mvc


    【解决方案1】:

    如果对象是string,或者(string)有显式的强制转换操作符,那么可以说

    string s = (string)obj["role"];
    

    否则,这会给你一个InvalidCastException

    注意这里可以说

    string s = obj["role"] as String;
    

    如果obj["role"] 不是string 的实例,则将s 设置为null请注意,对于 as,显式转换运算符将被忽略。

    如果obj["role"] 既不是string 也不是具有string 的显式强制转换运算符的类的实例,您必须说

    string s = obj["role"].ToString();
    

    但要小心,后者可以抛出NullReferenceException

    【讨论】:

    • .Net 中的所有对象都继承自 System.Object,它有一个 .ToString() 方法——我还没有找到一个对象,它会抛出一个空引用,只是为了调用 .ToString() 就可以了——之前我-1,你能举个例子吗?
    • @Basiclife:如果obj["role"]null,那么obj["role"].ToString() 将抛出一个NullReferenceException,因为我们试图取消引用null 引用。
    • 我见过像string s = (obj["role"] ?? string.Empty).ToString(); 这样的代码来避免NullReferenceException。不能说这是否是好的做法。
    • @Jason - 那么这实际上是一个索引问题而不是 .ToString() 问题 - 但无论如何,好的答案,+1 :)
    • @Basiclife:我的意思是,这是看待它的一种方式。但最重要的是,我遇到过很多人,他们直觉如果xnullx.ToString() 应该返回null(在某些情况下是String.Empty),但没有意识到他们是试图取消引用 null 引用。
    【解决方案2】:

    (string) 将实例转换为字符串,如果您尝试转换的对象不是字符串,它可能会在运行时 throw an exceptionas 运算符也尝试强制转换,但如果实例不是字符串但返回 null,它不会引发异常。 ToString 方法当然来自 System.Object,所以它取决于底层类型是否覆盖了它。

    【讨论】:

      【解决方案3】:

      它不应该对您的示例产生影响。唯一会产生影响的情况是,无论obj["role"] 是什么类型,都定义了用户类型转换(到string)。在这种情况下,可能是转换为 string 将其更改为不同的对象,而 .ToString() 的实现方式不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-22
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 2018-07-28
        相关资源
        最近更新 更多