.ToString(),(string),或者as String。什么时候使用哪个?

10

我遇到了一个困扰我的bug。我有一个JObject,我认为它应该没有问题

obj["role"].ToString()

字符串出现了且一切正常。最后的办法是改用一个

(string)obj["role"] 

只是为了看看会发生什么,并且它能够工作。我的问题是如何知道何时使用.ToString(),而不是(string)或"as String"。

3个回答

21
如果对象是一个字符串,或者存在到 (string) 的显式转换运算符,则可以这样说。
string s = (string)obj["role"];
否则,这将会给你一个InvalidCastException异常。
请注意,这里你可以说:
string s = obj["role"] as String;
如果obj["role"]不是string类型,也不是有显式类型转换到string的类的实例,则会将s设置为null。请注意,对于as操作符,显式转换运算符会被忽略。 如果obj["role"]既不是string类型,也不是具有显式类型转换为string的类的实例,则必须执行以下操作:
string s = obj["role"].ToString();

但要小心,后者可能会抛出NullReferenceException异常。


所有的.Net对象都继承自System.Object,它具有一个.ToString()方法。我还没有找到一个仅仅调用.ToString()就会抛出空引用异常的对象。在我给你打负分之前,你能举个例子吗? - Basic
7
如果 obj["role"]null,那么调用 obj["role"].ToString() 将会抛出一个 NullReferenceException 异常,因为我们试图对一个 null 引用进行解引用操作。 - jason
我见过像 string s = (obj["role"] ?? string.Empty).ToString(); 这样的代码,以避免 NullReferenceException。但我无法确定这是否是良好的编程实践。 - Matt DeKrey
@Jason - 那么这真的是一个索引问题,而不是.ToString()的问题 - 但无论如何,好答案,+1 :) - Basic
@Basiclife:我的意思是,这是一种看待问题的方式。但最重要的是,我遇到了很多人,他们有这样的直觉,即如果xnull,则x.ToString()应该返回null(在某些情况下是String.Empty),而不是意识到他们正在尝试取消引用一个null引用。 - jason
我喜欢详细的解释。谢谢! - MrM

2
(string)将实例转换为字符串,如果您尝试转换的对象不是字符串,则可能会在运行时抛出异常(throw an exception)。as操作符也尝试进行转换,但如果实例不是字符串,则不会抛出异常,而是返回null。当然,ToString方法来自System.Object,因此它取决于基础类型是否已覆盖它(ToString)

0
在您的示例中,这不应该有任何影响。唯一可能会产生影响的情况是,如果在obj["role"]所代表的类型上定义了用户类型转换(转换为string)。在这种情况下,将其强制转换为string可能会将其更改为另一个对象,从而导致.ToString()的实现方式不同。

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