C#中.ToString和“作为字符串”之间的区别


72

使用以下两个语句有什么区别?在我看来,第一个“作为字符串”是类型转换,而第二个ToString是对将输入转换为字符串的方法的实际调用?只是寻找一些见解(如果有)。

Page.Theme = Session["SessionTheme"] as string;
Page.Theme = Session["SessionTheme"].ToString();

Answers:


103

如果Session["SessionTheme"]不是stringas string将返回null

.ToString()会尝试通过调用对象的ToString()方法将任何其他类型转换为字符串。对于大多数内置类型,这将返回转换为字符串的对象,但是对于没有特定.ToString()方法的自定义类型,它将返回对象的类型名称。

object o1 = "somestring";
object o2 = 1;
object o3 = new object();
object o4 = null;

string s = o1 as string;  // returns "somestring"
string s = o1.ToString(); // returns "somestring"
string s = o2 as string;  // returns null
string s = o2.ToString(); // returns "1"
string s = o3 as string;  // returns null
string s = o3.ToString(); // returns "System.Object"
string s = o4 as string;  // returns null
string s = o4.ToString(); // throws NullReferenceException

要记住的另一件重要事情是,如果对象是null,则调用.ToString()将引发异常,但as string只会返回null


2
ToString()将“尝试将任何其他类型转换为字符串”?对于大多数内置类型,是的。说一个复杂的User对象,您在Session中拥有自己的自定义内容,这全都取决于您是否覆盖ToString()了该类以及如何在类中实现它。如果未实现,则返回类型信息字符串。
Wim Hollebrandse 2010年

2
当然是。但是这里的重点是说明ToString()和“作为字符串”之间的区别。如果我想提供完整的答案,那将是2页长
Philippe Leybaert 2010年

4
我的评论解释了这一点。那不是两页长。这是关于准确
Wim Hollebrandse 2010年

4
@Wim:准确有时会混淆OP。这并不意味着准确性不是一件好事,但有时最好简短回答
Philippe Leybaert 2010年

1
感谢你们两个的评论:)谢谢!
jaywon 2010年

13

as关键字将基本上检查是否该对象is的类型的一个实例,使用MSIL操作码isinst引擎盖下。如果是,它将返回对对象的引用,否则返回空引用。

正如很多人所说,它没有尝试执行这样的转换-这意味着某种异常处理。不是这样

ToString(),只需调用该对象的ToString()方法,该方法可以是由类实现的自定义方法(对于大多数内置类型,该方法将转换为字符串);或者,如果未提供,则object返回基类的方法,并返回类型信息。


6
Page.Theme = Session["SessionTheme"] as string;

尝试转换为字符串

Page.Theme = Session["SessionTheme"].ToString();

调用ToString()方法,它可以是真的任何东西。此方法不强制转换,它应该返回此对象的字符串表示形式。


4

首先,“任意对象作为字符串”和“ any-object.ToString() ”在各自的上下文方面是完全不同的。

string str = any-object as string;

1)这会将任意对象强制转换为字符串类型,如果任意对象不可转换为字符串,则此语句将返回null而不引发任何异常。
2)这是一个编译器服务。
3)这对于除字符串以外的任何其他类型都非常有效,例如:您可以将其作为Employee的任何对象来执行,其中Employee是库中定义的类。

string str = any-object.ToString();  

1)这将从类型定义中调用任意对象的ToString()。由于System.Object定义了ToString()方法,因此.Net框架中的任何类都可以使用ToString()方法进行重写。程序员将在任何对象类或结构定义中重写ToString(),并将根据任意对象扮演的责任和角色编写返回适当的任意对象字符串表示形式的代码。
2)就像您可以定义一个Employee类并重写ToString()方法,该方法可能返回Employee对象的字符串表示形式为“ FIRSTNAME-LASTNAME,EMP-CDOE”。

请注意,在这种情况下,程序员可以控制ToString(),而与转换或类型转换无关。


4

我在扩展Philippe Leybaert的已接受答案,是因为虽然我发现比较这三个方法的资源,但从未找到将这四个方法进行比较的解释。

  • (string)obj
  • obj as string
  • obj.ToString()
  • Convert.ToString(obj)
object o1 = "somestring";
object o2 = 1;
object o3 = new object();
object o4 = null;

Console.WriteLine((string)o1);           // returns "somestring"
Console.WriteLine(o1 as string);         // returns "somestring"
Console.WriteLine(o1.ToString());        // returns "somestring"
Console.WriteLine(Convert.ToString(o1)); // returns "somestring"
Console.WriteLine((string)o2);           // throws System.InvalidCastException
Console.WriteLine(o2 as string);         // returns null
Console.WriteLine(o2.ToString());        // returns "1"
Console.WriteLine(Convert.ToString(o2)); // returns "1"
Console.WriteLine((string)o3);           // throws System.InvalidCastException
Console.WriteLine(o3 as string);         // returns null
Console.WriteLine(o3.ToString());        // returns "System.Object"
Console.WriteLine(Convert.ToString(o3)); // returns "System.Object"
Console.WriteLine((string)o4);           // returns null
Console.WriteLine(o4 as string);         // returns null
Console.WriteLine(o4.ToString());        // throws System.NullReferenceException
Console.WriteLine(Convert.ToString(o4)); // returns string.Empty

从这些结果可以看出,当为字符串或null时(string)objobj as string它们的行为相同obj。否则(string)obj将抛出无效的强制转换异常,并且obj as string只会返回null。obj.ToString() 并且Convert.ToString(obj)彼此之间的行为也相同,除了当objnull为null时,在这种情况下obj.ToString()将抛出null引用异常,并且Convert.ToString(obj)返回一个空字符串。

所以这是我的建议:

  • (string)obj 如果您想为无法分配给字符串变量(包括null)的类型抛出异常,则效果最好
  • obj as string 如果您不想引发任何异常并且也不想使用非字符串的字符串表示形式,则效果最好
  • obj.ToString() 如果您想为null抛出异常,效果最好
  • Convert.ToString(obj) 如果您不想引发任何异常并且想要非字符串的字符串表示形式,则效果最好

编辑:我发现Convert.ToString()实际上null根据重载的不同对待,因此object在此示例中将变量声明为实际上很重要。如果您调用Convert.ToString()的是stringnull则它将返回null而不是string.Empty


3

为了进一步混淆该问题,C#6.0引入了空条件运算符。所以现在这也可以写成:

Page.Theme = Session["SessionTheme"]?.ToString();

这将返回null或ToString()的结果而不会引发异常。


尽管这很有用,但不确定如何直接回答as string和之间的区别问题.ToString()
crashmstr

1

as string检查的对象是一个字符串。如果不是null,则返回。

要将呼叫ToString()确实会调用ToString()该对象的方法。


1
它不会尝试投射。它检查该类是否为指定类型的实例,如果是,则返回引用,否则返回null。
Wim Hollebrandse 2010年

1

如果类是字符串或从字符串派生,则第一个以字符串形式返回类(如果不成功,则返回null)。

第二个在类上调用ToString()方法。


0

实际上,编写上面的代码的最佳方法是执行以下操作:

if (Session["SessionTheme"] != null)
{
    Page.Theme = Session["SessionTheme"].ToString();
}

这样,您几乎可以确定它不会强制转换为NullReferenceException。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.