gpt4 book ai didi

c# - object.ToString() 如何处理盒装值类型?

转载 作者:太空宇宙 更新时间:2023-11-03 21:00:19 25 4
gpt4 key购买 nike

class Program {

static void Main(string[] args) {
Int32 i = 123;
Double d = 123.456;
FunPrint(i);
FunPrint(d);
}

static void FunPrint(object obj) {
Console.WriteLine(obj);
}
}

我对这个示例的理解是,FunPrint() 首先创建一个新对象,并根据传递的 ValueType 的值构建它(在本例中为 Int32) .其次,调用 Object.ToString() 并正确显示特定于 ValueType 的字符串格式。

值类型不包含虚函数,所以...

我不明白的是 Object 如何知道它在内部持有什么类型以便进行正确的字符串格式化。

最佳答案

调用函数在调用 FunPrint 之前将参数装箱。

Value types do not contain virtual functions so...

其实他们可以。您可以从值类型实现接口(interface)。您无法从其中派生,这限制了覆盖级别。

但是要虚拟调用一个 虚函数 函数,你需要把值类型装箱。

该机制同样适用于此。该值已装箱,因此您可以调用其虚拟成员。


编辑以阐明在值类型上调用接口(interface)方法:

var i = 123;
i.ToString(); // not boxed, statically resolves to Int32.ToString()

var o = (object)o; // box
o.ToString(); // virtual call to object.ToString()

var e = (IEquatable<int>)i; // box
i.Equals(123); // virtual call to IEquatable<int>.Equals(int)

编辑以包含 Jon Hanna 的建议。在值类型上调用 System.Object虚方法确实需要装箱。

var i = 1234;
i.GetType(); // boxes!

在对应的IL中可以看到:

ldc.i4.s     123
stloc.0 // i
ldloc.0 // i
box [mscorlib]System.Int32
call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()

Object.GetType() 无法虚拟调用,有签名:

public extern Type GetType();

但它仍然需要装箱。

关于c# - object.ToString() 如何处理盒装值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46121358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com