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

use*_*677 5 c#

我对理解静态引用有点困惑.

当我声明时,我们可以理解实例引用

Car myCar = new Car();

Car yourCar = new Car();

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

-----------------                     ---------------
Run Code Online (Sandbox Code Playgroud)

如果是静态类怎么办?当我宣布时,我可以这么说吗?

staticClass.MyMethod( )

-----------------
Managed Heap
----------------
staticClass
(Memory Address ) 
----------------- 
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 11

不,static在C#中基本上意味着"与类型相关而不是类型的实例".

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

StaticClass.MyMethod()
Run Code Online (Sandbox Code Playgroud)

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

请注意,不允许声明属于静态类的变量.

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

StaticClass.StaticMethod();
Run Code Online (Sandbox Code Playgroud)

NormalClass.StaticMethod();
Run Code Online (Sandbox Code Playgroud)

乃至

SomeValueType.StaticMethod();
Run Code Online (Sandbox Code Playgroud)

编辑:回复您的编辑:

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

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