C#C
C#2y ago
wtq40cy3n

How to understand pining static field, const and instance field

I am learning unsafe C#, and trying to understand when to use fixed statement. Here's the example:
class K { public int k; }
struct C
{
    public int instanceMember;
    public readonly static int shared;
    public const int con = 0;
    unsafe void M(int j, K k)
    {
        fixed (int* p = &j) { } // CS0213
        fixed (int* p = &k.k) { }
        int local = 0;
        fixed (int* p = &local) { } // CS0213
        int[] localArray = [];
        fixed (int* p = localArray) fixed (int* pp = p) { } // CS8385
        string localString = "abc";
        fixed (char* p = localString) fixed (char* pp = p) { } // CS8385
        K kk = new();
        fixed (int* p = &kk.k) { }
        fixed (int* p = &this.instanceMember) { }
        fixed (int* p = &C.shared) { }
        fixed (int* p = &C.con) { } // CS0211
    }
}

The question is, why can I pin a static field? Is it because static field live during the whole cycle, so it's managed?
And what about const, is it because const isn't a variable or field so simply can't get the address?
And for instance field, since it's fixed inside the instance method, so ...? I don't really know how to explain this.

Please let me know if I understand them wrong, thank you!
Was this page helpful?