在 C# 中对值类型调用方法时是否隐式完成装箱?
Is boxing implicitly done when calling a method on a value type in C#?
假设我做了这样的事情:
int x = 5;
String s = x.ToString();
来自 Java,我会认为正在对 int 值进行自动装箱以使其表现得像一个对象并在其上调用方法。但是我听说在 C# 中一切都是一个对象,并且没有诸如 Java "Integer" 类型之类的东西。那么,变量是否被装箱到 Object 呢?或者可以直接从 C# 值类型调用方法吗?怎么样?
C# int 是像 Java/C 中那样的 32 位 space,还是更多?预先感谢您消除我的疑虑。
int
是一个结构,因此它是在堆栈而不是堆上声明的。但是,C# 中的结构可以像 class 一样具有方法、属性和字段。方法 ToString()
是在类型 System.Object
上定义的,所有 class 类和结构都派生自 System.Object
。因此在结构上调用 .ToString() 不会进行任何类型的装箱(将值类型更改为引用类型)。
如果您想在 C# 中查看装箱,可以像这样使用强制转换或隐式转换。
public void Testing() {
// 5 is boxed here
var myBoxedInt = (object)5;
var myInt = 4;
// myInt is boxed and sent to the method
SomeCall(myInt);
}
public void SomeCall(object param1){}
详细说明@Igor 的回答并给你一些细节:
此代码:
public void Test() {
int x = 5;
string s = x.ToString();
}
可以认为是这个假设的代码:
public void Test() {
int x = 5;
string s = StringInternals.ToString(x);
}
// ...
public static class StringInternals {
public static string ToString( int x ) {
// Standard int to -> string implementation
// Eg, figure out how many digits there are, allocate a buffer to fit them, read out digits one at a time and convert digit to char.
}
}
假设我做了这样的事情:
int x = 5;
String s = x.ToString();
来自 Java,我会认为正在对 int 值进行自动装箱以使其表现得像一个对象并在其上调用方法。但是我听说在 C# 中一切都是一个对象,并且没有诸如 Java "Integer" 类型之类的东西。那么,变量是否被装箱到 Object 呢?或者可以直接从 C# 值类型调用方法吗?怎么样?
C# int 是像 Java/C 中那样的 32 位 space,还是更多?预先感谢您消除我的疑虑。
int
是一个结构,因此它是在堆栈而不是堆上声明的。但是,C# 中的结构可以像 class 一样具有方法、属性和字段。方法 ToString()
是在类型 System.Object
上定义的,所有 class 类和结构都派生自 System.Object
。因此在结构上调用 .ToString() 不会进行任何类型的装箱(将值类型更改为引用类型)。
如果您想在 C# 中查看装箱,可以像这样使用强制转换或隐式转换。
public void Testing() {
// 5 is boxed here
var myBoxedInt = (object)5;
var myInt = 4;
// myInt is boxed and sent to the method
SomeCall(myInt);
}
public void SomeCall(object param1){}
详细说明@Igor 的回答并给你一些细节:
此代码:
public void Test() {
int x = 5;
string s = x.ToString();
}
可以认为是这个假设的代码:
public void Test() {
int x = 5;
string s = StringInternals.ToString(x);
}
// ...
public static class StringInternals {
public static string ToString( int x ) {
// Standard int to -> string implementation
// Eg, figure out how many digits there are, allocate a buffer to fit them, read out digits one at a time and convert digit to char.
}
}