Fixed Statement in C#

£可爱£侵袭症+ 提交于 2019-12-18 07:45:10

问题


We have similar code to the following in one of our projects. Can anyone explain (in simple English) why the fixed statement is needed here?

class TestClass
{
    int iMyVariable;
    static void Main()
    {
        TestClass oTestClass = new TestClass();
        unsafe
        {
            fixed (int* p = &oTestClasst.iMyVariable)
            {
                *p = 9;
            }
        }
    }
}

回答1:


It fixes the pointer in memory. Garbage collected languages have the freedom to move objects around memory for efficiency. This is all transparent to the programmer because they don't really use pointers in "normal" CLR code. However, when you do require pointers, then you need to fix it in memory if you want to work with them.




回答2:


The fixed statement will "pin" the variable in memory so that the garbage collector doesn't move it around when collecting. If it did move the variable, the pointer would become useless and when you used it you'd be trying to access or modify something that you didn't intend to.




回答3:


You need it anywhere you do pointer arithmetic, to prevent the garbage collector from moving it around on you.




回答4:


Because you are running in unsafe mode (pointer), the fixed instruction allocate a specific memory space to that variable. If you didn't put the fixed instruction, the garbage collector could move in memory the variable anywhere, when he want.

Hope this help.




回答5:


MSDN has a very similar example. The fixed statement basically blocks garbage collection. In .Net if you use a pointer to a memory location the runtime can reallocate the object to a "better" location at any time. SO if you want to access memory directly you need to fix it in place.



来源:https://stackoverflow.com/questions/153376/fixed-statement-in-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!