.ToString和C#中“as string”的区别

使用以下两条语句有什么区别? 在我看来,第一个“作为string”是一个types转换,而第二个ToString是一个实际的调用方法,将input转换为一个string? 只是寻找一些见解,如果有的话。

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

如果Session [“SessionTheme”]不是一个string,“as string”将返回null。

.ToString()将通过调用对象的.ToString()方法尝试将其他types转换为string。 对于大多数内置types,这将返回转换为string的对象,但对于没有特定.ToString()方法的自定义types,它将返回对象types的名称。

 object o1 = "somestring"; object o2 = 1; string s = o1 as string; // returns "somestring" string s = o2 as string; // returns null string s = o2.ToString(); // returns "1" 

另一个重要的事情要记住的是,如果对象为null,调用.ToString()将引发exception,但“作为string”将简单地返回null。

as关键字基本上会检查对象是否is该types的一个实例,在isinst下使用MSIL操作码isinst 。 如果是,则返回对该对象的引用,否则返回null引用。

并不像许多人所说的那样试图进行演员表演 – 这意味着某种exception处理。 不是这样。

ToString()只需调用对象的ToString()方法,或者由类实现的自定义方法(对于大多数内置types执行转换为string) – 或者如果没有提供,则返回基类object ,返回键入信息。

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

尝试投射到一个string

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

调用tostring方法,这可能是真的。 这个方法没有强制转换,它应该返回这个对象的string表示。

首先,“ any-object as string ”和“ any-object.ToString() ”在各自的上下文中是完全不同的东西。

 string str = any-object as string; 

1)这会将任何对象转换为stringtypes,如果任何对象不能转换为string,那么这个语句将返回null而不会抛出任何exception。
2)这是一个编译器服务。
3)除了string之外,其他任何types的工作都非常好,例如:你可以像Employee那样做任何对象,其中Employee是库中定义的类。

 string str = any-object.ToString(); 

1)这将调用types定义的任何对象的ToString()。 由于System.Object定义了ToString()方法,因此.Net框架中的任何类都有ToString()方法可用于重载。 程序员将覆盖任何对象类或结构定义中的ToString(),并根据任意对象所扮演的责任和angular色,编写返回适当的任何对象的string表示forms的代码。
2)就像你可以定义一个Employee类并重载ToString()方法,它可以返回Employee对象的string表示forms为“FIRSTNAME – LASTNAME,EMP-CDOE”。

请注意,在这种情况下,程序员可以控制ToString(),并且与cast或type-conversion没有任何关系。

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

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

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

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

ToString()的调用确实会调用对象上的ToString()方法。

如果类是一个string或从一个string派生的第一个返回类作为一个string(如果不成功返回null)。

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

其实写上面代码的最好的方法是做以下事情:

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

这样你几乎可以确定它不会抛出一个NullReferenceException。