C# .ToString和“ToString”之间的区别;“作为字符串”;在C中#

C# .ToString和“ToString”之间的区别;“作为字符串”;在C中#,c#,string,tostring,C#,String,Tostring,使用以下两种语句之间有什么区别?在我看来,第一个“as string”是类型转换,而第二个ToString是对将输入转换为字符串的方法的实际调用?只是想了解一些情况 Page.Theme = Session["SessionTheme"] as string; Page.Theme = Session["SessionTheme"].ToString(); 如果Session[“sessionteme”]不是字符串,作为字符串将返回null .ToString()将通过调用对象的ToStrin

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

Page.Theme = Session["SessionTheme"] as string;
Page.Theme = Session["SessionTheme"].ToString();
如果
Session[“sessionteme”]
不是
字符串
作为字符串
将返回
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
Page.Theme = Session["SessionTheme"] as string;

另一件需要记住的重要事情是,如果对象是
null
,调用
.ToString()
将抛出异常,但是
as string
将简单地返回
null

as string
检查对象是否是字符串。如果不是null,则返回

调用
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
Page.Theme = Session["SessionTheme"] as string;
试图转换为字符串

鉴于

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

调用
ToString()
方法,该方法可以是任何真正的方法。此方法不强制转换,它应该返回此对象的字符串表示形式。

如果类是字符串或派生自字符串,则第一个方法将类作为字符串返回(如果失败,则返回null)


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

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

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


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

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

if (Session["SessionTheme"] != null)
{
    Page.Theme = Session["SessionTheme"].ToString();
}
这样,您几乎可以确定它不会抛出NullReferenceException。

首先“任何对象作为字符串”和“任何对象。ToString()”在各自的上下文中是完全不同的

string str = any-object as string;
1) 这会将任何对象强制转换为字符串类型,如果任何对象不可强制转换为字符串,则此语句将返回null而不会引发任何异常。
2) 这是一个编译器服务。
3) 这对于除字符串以外的任何其他类型都非常有效,例如:您可以作为Employee作为任何对象进行操作,Employee是库中定义的类

string str = any-object.ToString();  
1) 这将从类型定义中调用任何对象的ToString()。由于System.Object定义了ToString()方法,.Net framework中的任何类都有ToString()方法可供使用。程序员将超越任何对象类或结构定义中的ToString(),并根据任何对象所扮演的职责和角色编写返回任何对象的适当字符串表示形式的代码。
2) 就像您可以定义一个类Employee和over-ride-ToString()方法一样,该方法可以将Employee对象的字符串表示形式返回为“FIRSTNAME-LASTNAME,EMP-CDOE”


请注意,在这种情况下,程序员可以控制ToString(),而与强制转换或类型转换无关。

为了进一步混淆这一问题,C#6.0引入了。所以现在这也可以写成:

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

它将返回null或ToString()的结果,而不会引发异常。

我对Philippe Leybaert接受的答案进行了一点扩展,因为虽然我找到了比较其中三个的资源,但我从未找到比较所有四个的解释

  • (字符串)obj
  • obj作为字符串
  • obj.ToString()
  • Convert.ToString(obj)
从这些结果中,我们可以看到
(string)obj
obj as string
obj
为字符串或null时表现相同;否则,
(string)obj
将抛出无效的强制转换异常,
obj as string
将只返回null<代码>对象ToString()
Convert.ToString(obj)
的行为方式也相同,除非
obj
为null,在这种情况下
obj.ToString()
将抛出null引用异常,而
Convert.ToString(obj)
将返回空字符串

以下是我的建议:

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

编辑:我发现
Convert.ToString()
实际上根据重载的不同来处理
null
,因此在本例中变量声明为
对象实际上很重要。如果对
null
string
变量调用
Convert.ToString()
,它将返回
null
,而不是
string.Empty

,它不会尝试强制转换。它检查类是否是指定类型的实例,如果是,则返回引用,否则返回null。
ToString