C
C#3mo 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
}
}
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!
4 Replies
Unknown User
Unknown User3mo ago
Message Not Public
Sign In & Join Server To View
Aaron
Aaron3mo ago
static fields have no requirement to live in pinned memory, so you have to pin them, and consts don't have a memory location consts are copied into all the places you use them, they aren't "fields"
wtq40cy3n
wtq40cy3n3mo ago
I found a description from documentation
Note: As stated in §12.8.7, outside an instance constructor or static constructor for a struct or class that defines a readonly field, that field is considered a value, not a variable. As such, its address cannot be taken. Similarly, the address of a constant cannot be taken.
wtq40cy3n
wtq40cy3n3mo ago
Unsafe code - C# language specification
This chapter describes elements of C# that are allowed in unsafe code blocks. These elements include pointers, fixed buffers and dynamic memory allocation.