2

在另一个话题中,一位好人引用 Eric Lippert 的话告诉我:静态的意义与编译器在编译某个类/结构/字段时所拥有的知识和确定性有关。它与内存位置以及它们是否固定等无关。

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

        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 传递一些 args 时都会发生幕后引脚?如果静态成员是可移动的,那么运行时如何保证数组元素的地址在被调用函数执行期间不会改变?我从一个实验中了解到,对象的返回值 Item prop 除了数组之外是不允许通过 Ref 传递的。我认为这是因为数组元素被分配在一块连续的内存中,但是如果整个数组是可移动的,那么如何获取其元素的地址呢?

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

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

试图理解它:

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

4

1 回答 1

4

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

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

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

(C++/CLI 支持 .NET 引用和本机引用)

如果静态成员是可移动的,那么运行时如何保证数组元素的地址在被调用函数执行期间不会改变?

它没有。但该函数将使用更新后的地址,因为它也是.NET 代码。

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

于 2011-07-31T01:58:41.853 回答