double.IsNaN - 编译器在这做什么

时间:2010-03-18 09:40:42

标签: c#

当我们做double.IsNaN之类的事情时 - 到底发生了什么?

如果double是一个类,我会理解它,但double是一个结构,它是一个值类型,所以C#如何实际调用值类型的静态方法?

4 个答案:

答案 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继承,这使得编译器将数据类型视为简单值。这会改变数据的存储方式,并在某种程度上限制了对象的能力。例如,结构可以不具有虚拟方法,因为数据没有用像对象那样的虚拟方法表的指针来装饰。但是,结构仍然可以具有常规方法和属性。

相关问题