C # 中.ToString 和“ as string”的区别

使用以下两种语句的区别是什么?在我看来,第一个“ as string”是一个类型强制转换,而第二个 ToString 是对一个将输入转换为字符串的方法的实际调用?只是想听听有没有什么见解。

Page.Theme = Session["SessionTheme"] as string;
Page.Theme = Session["SessionTheme"].ToString();
39552 次浏览

如果 Session["SessionTheme"]不是 stringas 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 string检查是对象是一个字符串。如果它不是一个空值,它返回。

ToString()的调用实际上将调用对象上的 ToString()方法。

Page.Theme = Session["SessionTheme"] as string;

试图转换成一个字符串

然而呢

Page.Theme = Session["SessionTheme"].ToString();

调用 ToString()方法,它实际上可以是任何东西。此方法不进行强制转换,它应该返回此对象的字符串表示形式。

如果类是字符串或从字符串派生,则第一个函数返回字符串形式的类(如果不成功,则返回 null)。

第二个调用类上的 ToString ()方法。

as关键字基本上将检查对象 is是否为该类型的实例,使用 MSIL 操作码 isinst。如果是,则返回对对象的引用,否则返回空引用。

正如许多人所说的那样,是的并不试图以这种方式执行强制转换——这意味着某种类型的异常处理。不是这样的。

ToString(),简单地调用对象的 ToString()方法,或者是类实现的自定义方法(对于大多数内置类型来说,它执行字符串转换) ,或者如果没有提供,则调用基类 object的方法,返回类型信息。

实际上,编写上述代码的最佳方法是执行以下操作:

if (Session["SessionTheme"] != null)
{
Page.Theme = Session["SessionTheme"].ToString();
}

这样您几乎可以确定它不会抛出 NullReferenceException。

首先,“ 作为字符串的 any-object”和“ Any-object. ToString ()”在它们各自的上下文中是完全不同的东西。

string str = any-object as string;

1)这将把 any-object 强制转换为 string 类型,如果 any-object 不能强制转换为 string,那么这个语句将返回 null 而不抛出任何异常。
2)这是一个编译服务。
3)对于字符串以外的任何其他类型,例如: 您可以将它作为 Employee 这样的任何对象,其中 Employee 是在您的库中定义的类。

string str = any-object.ToString();

1)这将从类型定义调用任意对象的 ToString ()。从系统开始。对象中的任何类定义 ToString ()方法。Net 框架具有可用于重写的 ToString ()方法。程序员将在任何对象类或结构定义中重写 ToString () ,并根据任何对象的职责和角色编写返回任何对象的合适字符串表示的代码。
2)就像你可以定义一个类 Employee 并重写 ToString ()方法,它可以返回 Employee 对象的字符串表示为“ FIRSTNAME-LASTNAME,EMP-CDOE”。

请注意,在这种情况下,程序员可以控制 ToString () ,它与转换或类型转换没有任何关系。

为了进一步混淆视听,C # 6.0引入了 空条件运算符:

Page.Theme = Session["SessionTheme"]?.ToString();

它将返回 null 或 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

从这些结果中我们可以看到,当 obj是字符串或 null 时,(string)objobj as string的行为方式是相同的; 否则 (string)obj将抛出无效的强制转换异常,而 obj as string将只返回 null。obj.ToString() Convert.ToString(obj)Convert.ToString(obj)的行为方式也相同,除了当 obj为 null 时,在这种情况下,obj.ToString()将抛出一个 null 引用异常,而 Convert.ToString(obj)将返回一个空字符串。

以下是我的建议:

  • 如果您希望引发不能分配给字符串变量(包括 null)的类型的异常,那么 (string)obj的工作效果最好
  • 如果您不想引发任何异常,也不想要非字符串的字符串表示形式,那么 obj as string工作得最好
  • 如果希望为 null 抛出异常,则 obj.ToString()工作得最好
  • 如果您不想抛出任何异常并希望使用非字符串的字符串表示形式,那么 Convert.ToString(obj)工作得最好

编辑: 我发现 Convert.ToString()实际上根据重载的不同对待 null,所以在这个例子中变量被声明为 object实际上很重要。如果对 string变量 null调用 Convert.ToString(),那么它将返回 null而不是 string.Empty