使用以下两个语句有什么区别?在我看来,第一个“作为字符串”是类型转换,而第二个ToString是对将输入转换为字符串的方法的实际调用?只是寻找一些见解(如果有)。
Page.Theme = Session["SessionTheme"] as string;
Page.Theme = Session["SessionTheme"].ToString();
Answers:
如果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
。
ToString()
将“尝试将任何其他类型转换为字符串”?对于大多数内置类型,是的。说一个复杂的User对象,您在Session中拥有自己的自定义内容,这全都取决于您是否覆盖ToString()
了该类以及如何在类中实现它。如果未实现,则返回类型信息字符串。
首先,“任意对象作为字符串”和“ 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(),而与转换或类型转换无关。
我在扩展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)obj
,obj as string
它们的行为相同obj
。否则(string)obj
将抛出无效的强制转换异常,并且obj as string
只会返回null。obj.ToString()
并且Convert.ToString(obj)
彼此之间的行为也相同,除了当obj
null为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()
的是string
,null
则它将返回null
而不是string.Empty
。
的 as string
检查的对象是一个字符串。如果不是null,则返回。
要将呼叫ToString()
确实会调用ToString()
该对象的方法。