C# - 静态类调用意味着“地址内容?”

时间:2009-09-07 12:58:53

标签: c#

我对理解静态参考有点困惑。

当我声明

时,

我们可以理解的实例引用

Car myCar = new Car();

Car yourCar = new Car();

---------------                       --------------
stack                                 Managed Heap
----------------                      --------------
                                        -----
myCar         ------- > points to       Car
                                        -----
YourCar       ------- > points to       Car
                                        -----

-----------------                     ---------------

如果是静态类怎么办?当我宣布

时,我可以这么说吗?
staticClass.MyMethod( )

-----------------
Managed Heap
----------------
staticClass
(Memory Address ) 
----------------- 

更新:因为类是蓝图而对象是物理实体;当我声明staticClass.MyMethod或staticClass.MyField = value时,我是否直接与堆交互?(因为静态类不允许实例)。

2 个答案:

答案 0 :(得分:11)

不,C#中的static基本上意味着“与类型相关而不是类型的实例”。

任何静态方法都是静态解析的 - 即在编译时 - 所以调用

StaticClass.MyMethod()

只是解析为静态方法的调用,根本没有涉及实例。没有什么可以指出的,除了类型本身(这是隐式完成的)。

请注意,您不能声明属于静态类的变量。

编辑:基本上,这里的区别在于静态方法和实例方法。碰巧静态类不能有实例方法,你不能创建实例方法,但是没有区别:

StaticClass.StaticMethod();

NormalClass.StaticMethod();

甚至

SomeValueType.StaticMethod();

编辑:回复您的修改:

  • 当你设置一个静态字段时,确实会影响堆,但我相信它的堆内存区域与普通的gen0 / gen1 / gen2堆略有不同。 (对于静态变量,我认为每个AppDomain的堆就在堆上。)
  • 当你调用一个静态方法时,它基本上会在JITted代码中作为对特定地址的一些代码的调用而结束。换句话说,它将存在于一些可执行的内存中,但不会出现在用于实例数据的内存区域中。

编辑:我不确定“应用程序级别范围”是什么意思 - 但静态变量与类型相关联,该类型与AppDomain相关联。只要加载AppDomain,变量就会被保留。可以出于各种原因卸载它。

答案 1 :(得分:0)

将静态类视为相关方法的命名空间。从技术上讲,它不是面向对象的编程,因为该类不会用于创建对象。这只是将相关方法组合在一起并允许将一些OO相关技术应用于类的方法。 (继承,最重要的。)