gpt4 book ai didi

c# - 无论如何,静态成员是可移动的还是固定的?

转载 作者:行者123 更新时间:2023-11-30 21:13:20 24 4
gpt4 key购买 nike

在另一个topic ,一个好人引用 Eric Lippert 的话告诉我:static 的重要性与编译器在编译时对某个类/结构/字段的知识和确定性有关。它与内存位置以及它们是否固定等无关。

但我还是不太确定,因为编译器允许发生如下所示的事情。

        struct MyStruct
{
public static int[] Arr = {1,3,5};
}
static void Test<T>(ref T t) where T:struct
{
Console.WriteLine (t);
}
void Main()
{
Test(ref MyStruct.Arr[2]);//output: as expected 5
}

与 C++ 引用相比,ref 参数是否完全不同,或者每次 ref 传递某些参数时都会发生幕后 pin?如果静态成员是可移动的,运行时如何保证数组元素的地址在被调用函数执行期间不会改变?我从一个实验中了解到,除了数组之外,对象的 Item prop 的返回值不允许通过 Ref 传递。我认为那是因为数组元素分配在一大块连续内存中,但是如果整个数组是可移动的,那么如何获取其元素的地址?

我有点被这种不确定性所困扰。如果有人能给出一些确定的答案,我将不胜感激。提前致谢!

~~~~~~~~~~~~~~~~~~

试图理解它:

因此,只要编译器允许发生任何托管操作,我们就不应该担心,对吧?我有一些 C/C++ 背景,我想我很理解 C++ 中“静态”的含义,只有托管代码的可移动性让我怀疑。任何托管对象,无论它在堆栈上还是托管堆上,一个 ref arg 总能正确指向它,对吧?

最佳答案

C# ref 参数与 C++ 引用并没有完全不同,但它们在这方面有所不同。

C# ref 参数是垃圾收集器已知的,如果它将对象提升到不同的世代,它将调整它们。

C++ 引用对 .NET 垃圾收集器是不可见的,如果目标未固定且垃圾收集器运行,它们将中断。

(C++/CLI 同时支持 .NET 引用和 native 引用)

If the static members are movable, how does the runtime guarantee the address of a array element won't change during the execution of the called function?

事实并非如此。但是该函数将使用更新后的地址,因为它也是 .NET 代码。

而且这些都不会根据是否有引用数组的静态字段而改变。 (实际上数组本身不是静态的,只有引用它的字段。这个事实使整个问题变得荒谬。)

关于c# - 无论如何,静态成员是可移动的还是固定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6887061/

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