.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。