使用以下两个语句有什么区别?在我看来,第一个“as string”是类型转换,而第二个ToString是对将输入转换为字符串的方法的实际调用?只是寻找一些见解,如果有的话。
Page.Theme = Session["SessionTheme"] as string;
Page.Theme = Session["SessionTheme"].ToString();
答案 0 :(得分:93)
如果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
。
答案 1 :(得分:13)
as
关键字将基本上检查对象is
是否为该类型的实例,使用MSIL操作码isinst
。如果是,则返回对象的引用,否则返回null引用。
ToString()
,简单地调用对象的ToString()
方法,或者由类实现的自定义方法(对于大多数内置类型执行转换为字符串) - 或者如果没有提供,则为基础class object
的一个,返回类型信息。
答案 2 :(得分:5)
Page.Theme = Session["SessionTheme"] as string;
尝试强制转换为字符串
,而
Page.Theme = Session["SessionTheme"].ToString;
调用tostring方法,它可以是任何真正的东西。此方法不会强制转换,它应返回此对象的字符串表示形式。
答案 3 :(得分:4)
首先,“ 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(),它与转换或类型转换无关。
答案 4 :(得分:3)
为了进一步混淆这个问题,C#6.0引入了null-conditional operator。所以现在这也可以写成:
Page.Theme = Session["SessionTheme"]?.ToString();
返回null或ToString()的结果而不抛出异常。
答案 5 :(得分:1)
as string
检查对象是一个字符串。如果它不是null,则返回。
对ToString()
的调用确实会调用对象上的ToString()
方法。
答案 6 :(得分:1)
如果类是字符串或从字符串派生,则第一个将类作为字符串返回(如果不成功则返回null)。
第二个调用类的ToString()方法。
答案 7 :(得分:1)
我在扩展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)obj
为字符串或null时,obj as string
和obj
的行为相同。否则(string)obj
将抛出无效的强制转换异常,而obj as string
将仅返回null。 obj.ToString()
和Convert.ToString(obj)
的行为也相同,除了obj
为null时,在这种情况下obj.ToString()
会引发空引用异常,而Convert.ToString(obj)
将返回空字符串。
这是我的建议:
(string)obj
最适用于您要为无法分配给字符串变量(包括null)的类型引发异常的情况。obj as string
如果您不想引发任何异常并且也不想使用非字符串的字符串表示形式,则效果最佳obj.ToString()
最有效Convert.ToString(obj)
如果您不想引发任何异常并且想要非字符串的字符串表示形式,则效果最好。答案 8 :(得分:0)
实际上,编写上述代码的最佳方法是执行以下操作:
if (Session["SessionTheme"] != null)
{
Page.Theme = Session["SessionTheme"].ToString();
}
这样你几乎可以肯定它不会抛出NullReferenceException。