gpt4 book ai didi

C# - 静态类调用意味着 "content at address ? "

转载 作者:太空狗 更新时间:2023-10-29 22:25:04 24 4
gpt4 key购买 nike

只是我对静态引用的理解有点困惑。

incase of instance reference we can understand when i declare

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 时,如果是静态类,我是否直接与堆交互?(因为静态类不允许实例)。

最佳答案

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

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

StaticClass.MyMethod()

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

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

编辑:基本上,这里的区别在于静态方法和实例方法。正好静态类不能有实例方法,也不能创建实例方法,不过这两者没有区别:

StaticClass.StaticMethod();

NormalClass.StaticMethod();

甚至

SomeValueType.StaticMethod();

编辑:回应您的编辑:

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

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

关于C# - 静态类调用意味着 "content at address ? ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1389324/

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