C#中的.ToString和"as string"之间的区别

jay*_*won 66 c# string tostring

使用以下两个语句有什么区别?在我看来,第一个"as string"是类型转换,而第二个ToString是对将输入转换为字符串的方法的实际调用?只是寻找一些洞察力,如果有的话.

Page.Theme = Session["SessionTheme"] as string;
Page.Theme = Session["SessionTheme"].ToString();
Run Code Online (Sandbox Code Playgroud)

Phi*_*ert 96

如果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
Run Code Online (Sandbox Code Playgroud)

要记住的另一个重要事项是,如果对象是null,调用.ToString()将抛出异常,但as string只会返回null.

  • 我的评论解释了它.这不是2页长.这是关于*准确*. (3认同)
  • @Wim:准确有时会混淆OP.这并不意味着准确性不是一件好事,但有时最好保持答案的简短 (3认同)
  • `ToString()`'会'尝试将任何其他类型转换为字符串'?对于大多数内置类型,是的.在Session中使用自己的自定义东西,比如说一个复杂的User对象,所有这些都取决于你是否覆盖了`ToString()`以及你如何在你的类中实现它.如果未实现,则返回类型信息字符串. (2认同)
  • 是的当然。但这里的重点是说明 ToString() 和“作为字符串”之间的区别。如果我想提供一个完整的答案,它将有 2 页长 (2认同)

Wim*_*dse 13

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

正如许多人所说的那样,它没有尝试执行这样的转换 - 这意味着某种异常处理.不是这样.

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


Kyl*_*ney 8

我稍微扩展了 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
Run Code Online (Sandbox Code Playgroud)

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

所以这是我的建议:

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

编辑:我发现Convert.ToString()实际上null根据重载的不同会进行不同的处理,因此在本例中将该变量声明为 an 实际上很重要object。如果您调用Convert.ToString()一个string变量,那么null它将返回null而不是string.Empty.


Oxy*_*ron 5

Page.Theme = Session["SessionTheme"] as string;
Run Code Online (Sandbox Code Playgroud)

试图转换为字符串

Page.Theme = Session["SessionTheme"].ToString;
Run Code Online (Sandbox Code Playgroud)

调用tostring方法,这可能是真的.此方法不会强制转换,它应返回此对象的字符串表示形式.