使用以下两个语句有什么区别?在我看来,第一个“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
。如果是,则返回对对象的引用,否则返回空引用。
正如许多人所说,它并没有尝试执行这样的强制转换——这意味着某种异常处理。不是这样。
ToString()
, 只需调用对象的ToString()
方法,或者由类实现的自定义方法(对于大多数内置类型执行到字符串的转换) - 或者如果没有提供,则返回基类object
的方法,返回类型信息。
Page.Theme = Session["SessionTheme"] as string;
尝试转换为字符串
然而
Page.Theme = Session["SessionTheme"].ToString();
调用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
从这些结果中我们可以看到,当是字符串或空时(string)obj
,obj as string
它们的行为方式相同;obj
否则(string)obj
将抛出一个无效的强制转换异常,并且obj as string
只会返回 null。obj.ToString()
并且Convert.ToString(obj)
彼此的行为方式相同,除了当obj
为空时,在这种情况下obj.ToString()
将抛出空引用异常并Convert.ToString(obj)
返回一个空字符串。
所以这是我的建议:
(string)obj
如果您想为无法分配给字符串变量(包括 null)的类型抛出异常,效果最好obj as string
如果您不想抛出任何异常并且也不想要非字符串的字符串表示形式,效果最好obj.ToString()
如果您想为 null 抛出异常,效果最好Convert.ToString(obj)
如果您不想抛出任何异常并想要非字符串的字符串表示形式,效果最好编辑:我发现Convert.ToString()
实际上null
根据重载进行不同的处理,因此object
在本例中将变量声明为 an 实际上很重要。如果你调用Convert.ToString()
一个string
变量,null
那么它将返回null
而不是string.Empty
.
首先,“ any-object as string ”和“ 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(),它与强制转换或类型转换无关。
为了进一步混淆这个问题,C# 6.0 引入了空条件运算符。所以现在这也可以写成:
Page.Theme = Session["SessionTheme"]?.ToString();
它将返回 null 或 ToString() 的结果而不会引发异常。
as string
检查对象是一个字符串。如果它不是 null 则返回。
调用ToString()
确实会调用ToString()
对象上的方法。
如果类是字符串或从字符串派生,则第一个将类作为字符串返回(如果不成功则返回 null)。
第二个调用类的 ToString() 方法。
实际上,编写上述代码的最佳方法是执行以下操作:
if (Session["SessionTheme"] != null)
{
Page.Theme = Session["SessionTheme"].ToString();
}
这样你几乎可以肯定它不会抛出 NullReferenceException。