在另一个话题中,一位好人引用 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 总能正确指向它,对吧?