使用以下两个语句有什么区别?在我看来,第一个“as string”是类型转换,而第二个ToString是对将输入转换为字符串的方法的实际调用?只是寻找一些洞察力,如果有的话。
Page.Theme = Session["SessionTheme"] as string;
Page.Theme = Session["SessionTheme"].ToString();
如果Session["SessionTheme"]
不是string
,as 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
。
as
关键字将基本上检查对象is
是否为该类型的实例,使用MSIL操作码isinst
引擎盖下。如果是,则返回对象的引用,否则返回null引用。
正如许多人所说的那样,它并没有尝试执行这样的转换 - 这意味着某种异常处理。不是这样。
ToString()
,简单地调用对象的ToString()
方法,或者是由类实现的自定义方法(对于大多数内置类型执行转换为字符串) - 或者如果没有提供,则基类object
是一个,返回类型信息。
Page.Theme = Session["SessionTheme"] as string;
试图转换为字符串
而
Page.Theme = Session["SessionTheme"].ToString;
调用tostring方法,这可能是真的。此方法不会强制转换,它应返回此对象的字符串表示形式。
首先,“any-object as string”和“any-object.ToString()”就各自的上下文而言完全不同。
string str = any-object as string;
1)这会将any-object转换为字符串类型,如果any-object不能转换为string,则此语句将返回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(),它与转换或类型转换无关。
为了进一步混淆这个问题,C#6.0引入了null-conditional operator。所以现在这也可以写成:
Page.Theme = Session["SessionTheme"]?.ToString();
这将返回null或ToString()的结果而不抛出异常。
as string
检查对象是一个字符串。如果它不是null,则返回。
对ToString()
的调用确实会在对象上调用ToString()
方法。
如果类是字符串或从字符串派生,则第一个将类作为字符串返回(如果不成功则返回null)。
第二个调用类的ToString()方法。
实际上,编写上述代码的最佳方法是执行以下操作:
if (Session["SessionTheme"] != null)
{
Page.Theme = Session["SessionTheme"].ToString();
}
这样你几乎可以肯定它不会抛出NullReferenceException。