当我们做double.IsNaN
之类的事情时 - 到底发生了什么?
如果double
是一个类,我会理解它,但double是一个结构,它是一个值类型,所以C#如何实际调用值类型的静态方法?
答案 0 :(得分:5)
结构可以有方法。
...
只需要一个例子:
struct Foo {
public void Hey ()
{
Console.WriteLine("hey");
}
public static void DoSomething ()
{
Console.Read();
}
}
答案 1 :(得分:2)
NaN =非数字。
它是内置于float / double标准并在处理器本身中实现的东西。请参阅http://steve.hollasch.net/cgindex/coding/ieeefloat.html。
答案 2 :(得分:0)
从这里开始:http://social.msdn.microsoft.com/forums/en-US/clr/thread/16ffdb1f-119c-407e-b9f7-b9c79fec0e94/
实际上当你调用静态时 结构方法如下 步骤发生在通话之前: 1.CLR初始化名为a的运行时类型信息结构 CORINFO_CLASS_STRUCT包含几个 这类型的关键部分包括 静态方法指针。
2.您对静态方法的调用将被路由到该方法 JIT遵守的工具(如果 你的assemlby不是nGENed)。
在这个过程中,没有构造函数 参与。
答案 3 :(得分:0)
所有数据类型都继承自Object
基类型,因此任何数据类型都具有类似于对象的行为,因为它可以具有方法和属性。
Double
之类的结构不直接从Object
继承而是从ValueType
继承,这使得编译器将数据类型视为简单值。这会改变数据的存储方式,并在某种程度上限制了对象的能力。例如,结构可以不具有虚拟方法,因为数据没有用像对象那样的虚拟方法表的指针来装饰。但是,结构仍然可以具有常规方法和属性。