在为整数类型调用ToString时是否涉及到装箱?

sap*_*ito 11 .net c# boxing

很简单的问题:

int a = 5;
string str = a.ToString();
Run Code Online (Sandbox Code Playgroud)

既然ToString是System.Object的虚方法,它是否意味着每次我为整数类型调用此方法时,会发生装箱?

小智 11

你已经得到了答案告诉你,当ToString()一个值类型被覆盖时,你调用它时就没有拳击,但是有一些方法可以实际看到它.

取类型int?(Nullable<int>).这是一个有用的类型,因为它是一个值类型,但装箱可能会产生一个空引用,并且无法通过空引用调用实例方法.它确实有一个重写的ToString()方法.它没有(也没有)重写的GetType()方法.

int? i = null;
var s = i.ToString(); // okay: initialises s to ""
var t = i.GetType(); // not okay: throws NullReferenceException
Run Code Online (Sandbox Code Playgroud)

这表明在通话中没有拳击i.ToString(),但是在通话中有拳击i.GetType().


Mar*_*wul 5

其他答案提到ToString通话不会导致拳击。推论毫无价值:

int i = 42;
String.Format("number: {0}", i.ToString());
Run Code Online (Sandbox Code Playgroud)

不会导致拳击,而:

int i = 42;
String.Format("number: {0}", i);
Run Code Online (Sandbox Code Playgroud)

将要。

(你听到了吗,Resharper?)

(但是,请记住,如果您将格式化程序应用于String.Format(例如CultureInfo,您需要使用第二个版本)