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

时间:2010-01-20 08:19:43

标签: c# string tostring

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

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

9 个答案:

答案 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 stringobj的行为相同。否则(string)obj将抛出无效的强制转换异常,而obj as string将仅返回null。 obj.ToString()Convert.ToString(obj)的行为也相同,除了obj为null时,在这种情况下obj.ToString()会引发空引用异常,而Convert.ToString(obj)将返回空字符串。

这是我的建议:

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

答案 8 :(得分:0)

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

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

这样你几乎可以肯定它不会抛出NullReferenceException。