xxx.tostring() 和 (string)xxx 有什么区别?

3

以下两种字符串方法的区别是什么?

string str1 = dr["RAGStatusCID"].ToString();
string str2 = (string)dr["Description"];

结果是相同的,因为(字符串)是对ToString()的隐式调用。 - skyline26
8个回答

5
这将取决于dr的内容。第一个调用dr["RAGStatusCID"]的索引器上每个对象都可以重写的ToString方法。第二个将dr["Description"]变量转换为字符串。如果我们使用心灵感应技能并假设dr是一个SqlDataReader,那么这两个表达式基本上做同样的事情,只是如果Description列不是一个字符串,类型转换可能会在运行时抛出异常。

4
您没有提到dr的类型或它的索引器操作返回什么,但显然,这是两个非常不同的操作。

第一个调用dr的get索引器,并在返回的引用上调用ToString()方法,允许该引用所指向的对象提供其数据的字符串表示形式。 这样做的一般意图是允许对象本身以字符串的有意义表示形式返回自己

第二个调用尝试将索引器返回的引用强制转换为System.String。返回的对象必须是System.String的实例,或者必须是编译器可以调用自定义转换运算符的类型。这里的目的是确保返回的对象可以被视为System.String的实例。您可以在MSDN上阅读更多关于转换的信息(包括用户定义的转换)。


不错的回答。不过如果有C#转换的链接会更好。 - user166390

3

第一个调用返回字符串的方法。必须有人实现ToString方法。第二个只是拆箱。


2
string str1 = dr["RAGStatusCID"].ToString(); 

这会调用 dr["RAGStatusCID"] 返回的对象上的 .ToString() 方法。它保证返回一个字符串或 null。
string str2 = (string)dr["Description"]; 

此处尝试将 dr["Description"] 返回的对象转换为字符串。如果返回的对象不是字符串,则会抛出异常。


0
我不确定这对于C#是否正确,但很可能是这样的:
(String)myinstance隐式调用了myinstance类的.toString()实现。
如果你有一个像这样的类:
class User
{
      private integer userId;
      private integer userName;
      ... some code here...
      public toString()
      {
           return "Username: " + this.userName + " (" + this.userId + ")";
      }
}

使用方法toString,您正在定义(String)instance强制转换的行为。
User myuser = new User("Alex", 22);
String myuserdump = (String)myuser;
print(myuserdump);

将打印“用户名:Alex(22)”


0

xxx.ToString() 调用该对象上的方法将其转换为字符串对象。 (string)xxx 假定对象的类型已经是字符串,并在现有对象上执行强制转换。因此,在第一种情况下发生了转换,在第二种情况下仅明确标识了类型。

更简洁地说,如果在您的示例中 RagStatusCID 是一个整数,并且您尝试调用 (string)dr["RagStatusCID"],则会引发异常,因为类型不是字符串,而是 int。调用 .ToString() 执行转换,输出为字符串。


0

(string) 是一种类型转换操作。.ToString() 是从 Object 类继承的方法。每个对象都有一个 .ToString(),但并非所有对象都有一个 (string)。此外,某些对象将转换为与 .ToString() 输出不同的字符串。


0
简而言之,.toString() 是一种方法,就像其他任何方法一样,(String) 是一种类型转换,是一种语言结构,用于将一个数据类型视为另一个兼容的类型。
现在来详细介绍一下: .toString() 就像你可能遇到的其他任何方法一样,它通常被认为是一种“特殊”的方法,但实际上不是这样,它只是返回一串字符串。因为它是基本 Object 类型的成员,所以可以确保在每个对象中都可用。因此,它通常用于提供它是成员的对象的文本表示。默认情况下,在 C# 中,这是对象类型的名称。通常希望重写此方法以提供更有意义的名称,但它只需要返回一个字符串,可以是任何您喜欢的字符串。
如前所述,它并没有什么特别之处,你也可以很容易地拥有名为 ToInt()、ToDouble() 和 ToChar() 的方法,为各自的类型提供相同的功能。
转换是一种语言结构,这意味着它是内置在语言中的,并且专门为该语言实现。它用于使兼容但不同的类型在不同的位置使用,而无需进行显式转换。

3
这并不是...正确的--请看其他答案。C# 支持用户定义的隐式和显式转换。需要考虑被转换的类型(在这里是 object),在这种情况下,它实际上只是一个“普通的强制转换”。请注意,除非进行任何转换,否则只有字符串或字符串子类 “可以像一个字符串一样处理”。(string)(object)42无论如何都会失败,尽管它真的很想成功 :-/ - user166390

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