
рдореИрдВ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреВрдВрдЧрд╛ "рдХреНрдпреЛрдВ?" рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЦрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :) рдЖрдЦрд┐рд░рдХрд╛рд░, рдЕрдЧрд░ рдЖрдкрдХреЛ рдкреЙрдЗрдВрдЯрд░ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдХреБрдЫ рдФрд░ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SyncBlockIndex рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛, рдпрд╛ рдПрдХ MethodTable рд▓реЗрдирд╛ рдФрд░ рдЬрд╣рд╛рдВ рдпрд╣ рд╕реНрдерд┐рдд рд╣реИ, рдЙрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓реЗрдВред рдЖрдк рдкрд░рд╛рд╡рд░реНрддрди рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЗрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрдИ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдЦреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдЖрддреНрдо-рд╡рд┐рдХрд╛рд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдмрд╣рд░рд╣рд╛рд▓, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд┐рдзрд┐ рд╕рдВрдЦреНрдпрд╛ 1
рдЕрдиреБрд╕рдВрдзрд╛рди рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рдж рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдВрджрд░ рджреЛ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд░рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬрд╝ рдХрд░рдХреЗ рд╕рдВрд░рдЪрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЙрдирдХрд╛ рд╕рдЯреАрдХ рд╕рдВрд░реЗрдЦрдг рд╕реЗрдЯ рдХрд░реЗрдВред рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ?
- рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд┐рд╕реА рднреА рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдХреЗрд▓рд╛ рд╣реЗрдбрд░ рд╣реИред
- рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рднреА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдХреНрд╖рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдСрдлрд╕реЗрдЯ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗред
- рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдлрд╝реАрд▓реНрдбреНрд╕ рд╣реИрдВ, рддреЛ рдПрдХ рд╣реА рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (`[StructLayout (LayoutKind.explicit)]` рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдФрд░ `[FieldOffset (0)]` рдХреЛ рдЦреЗрддреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░), рдЬрдмрдХрд┐ рдПрдХ рдХреЛ рд▓рд┐рдЦреЗрдВ рдЗрдирдореЗрдВ рд╕реЗ, рдХреБрдЫ рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ, рдлрд┐рд░ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдкреЙрдЗрдВрдЯрд░ (рдлрд╝реАрд▓реНрдб рдСрдлрд╕реЗрдЯ рд╕рдорд╛рди рд╣реИ) рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реБрдП, рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рд╕рд╛рдордЧреНрд░реА рд╣реЛрддреА рд╣реИ, рд╣рдо рдЙрд╕реА рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд░реНрдЧ рд╣реИрдВ: `рдП` рдФрд░` рдмреА`, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, `рдП` рдХреЗ рдкрд╛рд╕ рдлрд╝реАрд▓реНрдб` рдСрдмреНрдЬреЗрдХреНрдЯ _рдлрд╝реАрд▓реНрдб` рд╣реИ, рдФрд░ рдХреНрд▓рд╛рд╕ `рдмреА` рдХреЗ рдкрд╛рд╕ рдлрд╝реАрд▓реНрдб` рдЗрдВрдЯ _рдлреАрд▓реНрдб` рд╣реИ, рддреЛ 32-рдмрд┐рдЯ рдкрд░ рдПрдХ рд╕рдВрд░рдЪрдирд╛ `C`, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ рдСрдлрд╝рд╕реЗрдЯ рдореЗрдВ рдЯрд╛рдЗрдк` A` рдФрд░ `B` рдХреЗ рд╕рд╛рде рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рдЖрдк рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкрддрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП` CA_field = рдирдИ рдСрдмреНрдЬреЗрдХреНрдЯ () `рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:` var address = CB_field`ред
рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, SafePtr рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рд░реНрдл рджреЛ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ: ReferenceType (1) рдФрд░ IntPtrWrapper (2) рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЧреБрдг - (5) рдФрд░ (6), рдЬреЛ рдПрдХ рдСрдлрд╕реЗрдЯ 0 (3) рдФрд░ (4) рдореЗрдВ рд╕рдВрд░реЗрдЦрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
[StructLayout(LayoutKind.Explicit)] public struct SafePtr {
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдХрд╛ рдЙрдкрдпреЛрдЧ:
var safeptr = SafePtr.Create(new object()); Console.WriteLine("Address of object is: {0}", safeptr.IntPtr.ToInt32());
рдпрд╣ рд╕рдм :) рдЖрдк рдЗрд╕реЗ рдПрдХ рд╕рд╛рдл рд╕реВрдЪрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
var safeptr = SafePtr.Create(new object()); unsafe { ((int *)safeptr.IntPtr)* = 0; } Console.WriteLine("Address of object is null: {0}", safeptr.Object == null);
рд╡рд┐рдзрд┐ рд╕рдВрдЦреНрдпрд╛ 2
рдПрдХ рдФрд░, рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред рдХрдбрд╝рд╛рдИ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП .net рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рд░реЗрдЧреБрд▓рд░ рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдРрд╕реА рдЬрдЧрд╣ рдвреВрдВрдврдиреА рд╣реЛрдЧреА, рдЬрд╣рд╛рдВ рдЯрд╛рдЗрдк рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЧреБрдо рд╣реЛ рдЬрд╛рдПред рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдм рд╡рд╣реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдРрд╕реА рдЬрдЧрд╣ рд╣реИ: рдПрдХ рдзрд╛рд░рд╛ рдвреЗрд░ред .Net рдХреЙрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдЯреНрд░реАрдо рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕реЗ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?), рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдЧрд░ .Net рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╡рд╣рд╛рдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) 32-рдмрд┐рдЯ рдорд╢реАрди рдкрд░ рд╣реИред 4 рдмрд╛рдЗрдЯреНрд╕, рддреЛ рдЖрдк рдмрд╕ рд╡рд╣рд╛рдБ рд╕реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди рдкрд░ JITTER рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
C # рд╣рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдкреБрд╢ рдХрд░рдиреЗ рдФрд░ рдПрдХ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдирд┐рд░реНрдорд╛рдг:
int pointer = new Object();
рдпрд╣ рдирд┐рд╖рд┐рджреНрдзред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ MSIL рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖рд┐рджреНрдз рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкрд░ рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рддрд░реАрдХреЗ (EntityPtr.il) рд▓рд┐рдЦреЗрдВ:
рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ `System.Runtime.CLR.EntityPtr` рд╡рд░реНрдЧ рдЪрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИ: