.NET рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдо рдорд╛рди рдкреНрд░рдХрд╛рд░ред рднрд╛рдЧ реи


рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдореБрдХреНрдХреЗрдмрд╛рдЬрд╝реА


рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдирд░рдХ рдФрд░ рдЙрдЪреНрдЪ рдкрд╛рдиреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдП рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рднреА рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЛ рдирд╛рдЦреВрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ .NET рд╕реАрдПрд▓рдЖрд░ рдЯреАрдо рдХреЗ рд▓рд┐рдП рднреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, microsoft.com рдкрд░ рдирд╣реАрдВ рдЬрд╛рдПрдБ рдФрд░ рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░реЗрдВред рдЕрдм, рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреИрд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рд┐рдВрдХрдмреЙрдХрдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ, рди рдХрд┐ рдХрд┐рд╕реА рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдердб рдЯреЗрдмрд▓ рдХрд╛ рдкреЙрдЗрдВрдЯрд░ред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдПрдХ рдкрд╣реЗрд▓реА рдХреЗ рд╕рднреА рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдорд┐рд▓реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд╛рдХреНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред


рдЕрдм, рдЖрдЗрдП рдлрд┐рд░ рд╕реЗ рдпрд╛рдж рдХрд░реЗрдВ рдХрд┐ рд╕реНрдореГрддрд┐ рдореЗрдВ рдХреИрд╕реЗ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд╣реА рдЬрдЧрд╣ рдорд┐рд▓рддреА рд╣реИ рдЬрд╣рд╛рдВ рд╡реЗ рд╣реИрдВред рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЛрдЯреА рдФрд░ рдмрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдвреЗрд░ рдкрд░ рдЖрд╡рдВрдЯрди рдорд┐рд▓рддрд╛ рд╣реИред рд╡реЗ рд╣рдореЗрд╢рд╛ рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдПрдХ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдвреЗрд░ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдореЗрдВ ToString, рд╕рдорд╛рди рдФрд░ GetHashCode рдЬреИрд╕реА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВред рд╡реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдФрд░ рдУрд╡рд░рд░рд╛рдЗрдбреЗрдмрд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рд╡реИрд▓реНрдпреВ рдЯрд╛рдЗрдк рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЗ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рд╕реЗ рдорд╛рдирд╡ рд░рд╣рд┐рдд рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рд╣реЛрдЧреА: рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖реЗрддреНрд░ рд╡рд╣рд╛рдВ рдЬрд╛рдПрдВрдЧреЗред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЗ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред


рдпрд╣ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдХрдореА рдХреГрддреНрд░рд┐рдо рд╣реИ


рдпрд╣ рдЕрдзреНрдпрд╛рдп рд░реВрд╕реА рд╕реЗ рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдкреЗрд╢реЗрд╡рд░ рдЕрдиреБрд╡рд╛рджрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдЖрдк рд░реВрд╕реА рдпрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЦреНрдпрддрдГ рдЪреАрдиреА рдпрд╛ рдЬрд░реНрдорди рдореЗрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдЖрдк рд╣рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЧрд┐рддреБрдм рдкрд░ рдПрдХ рд╕реНрдЯрд╛рд░ рджреЗрдирд╛ рд╣реИ рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдлреЛрд░реНрдХ рдХрд░рдирд╛ рд╣реИ github / sidristij / dotnetbook ред

рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдХрдореА рдХреГрддреНрд░рд┐рдо рд╣реИ:


  • рдПрдХ рд╡рд╕реНрддреБ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпрдХреНрд╖ рдирд╣реАрдВ;
  • рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрджрд░ ToString, рдмрд░рд╛рдмрд░реА рдФрд░ GetHashCode рд╣реИрдВред рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЕрдкрдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рдХрд┐ рдХрд┐рд╕реА object рд╕рдВрдмрдВрдз рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реИрдВ;
  • рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА object рдХреЛ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ ToString, рдмрд░рд╛рдмрд░реА рдФрд░ GetHashCode рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреВрд░рд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ;
  • рдЬрдм рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рдПрдХ рдореВрд▓ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдердб рдХреЙрд▓ рдХрд░рдирд╛ рд╕реНрдЯреИрдЯрд┐рдХ рдореЗрдердб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ: Method(ref structInstance, newInternalFieldValue) ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХреЙрд▓ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЬреЗрдЖрдИрдЯреА рдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдСрдлрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рдкреЙрдЗрдВрдЯрд░ рдкрд░ рдПрдХ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреА рдореЗрдЬ рдкрд░ рдХреВрджрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рдЕрдиреНрдп рд╕реНрдерд╛рди рдкрд░ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ ред

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рднрд┐рдиреНрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдВрддрд░ CLR рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕реНрддрд░ рдкрд░ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред


рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рд▓рд┐рдЦреЗрдВ:


 var obj = (object)10; 

рдпрд╣ рд╣рдореЗрдВ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдВрдмрд░ 10 рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЗрд╕реЗ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП VMT рд╣реИ рдЬреИрд╕реЗ рдХрд┐ ToString (), рдмрд░рд╛рдмрд░реА рдФрд░ GetHashCodeред рд╣рдХреАрдХрдд рдореЗрдВ рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдореВрд▓ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдирд╣реАрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдореВрд▓ рдореВрд▓реНрдп рдХреЛ рд╣рд░ рдЬрдЧрд╣ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд╕реНрдЯреИрдХ рдкрд░ рдпрд╛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВред рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рдорд╛рди рдХреЛ рдПрдХ рд╕рдВрджрд░реНрдн рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬрдм рдореБрдХреНрдХреЗрдмрд╛рдЬреА рд╣реЛрддреА рд╣реИ:


  • рд╕реАрдПрд▓рдЖрд░ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдвреЗрд░ рдкрд░ рдЬрдЧрд╣ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ + рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ SyncBlockIndex + VMT (ToString, GetHashCode, рдмрд░рд╛рдмрд░) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП;
  • рдпрд╣ рд╡рд╣рд╛рдБ рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИред

рдЕрдм, рд╣рдореЗрдВ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓рд╛ рд╣реИред рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдлрд╝реАрд▓реНрдб рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╕реЗрдЯ рдорд┐рд▓рд╛ рд╣реИ,
рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдХреЗ рдмрд╛рдж рдПрдХ рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдмрди рдЧрдпрд╛ред рд╕рдВрд░рдЪрдирд╛ рдПрдХ рд╡рд░реНрдЧ рдмрди рдЧрдИред рдЪрд▓реЛ рдЗрд╕реЗ рдПрдХ .NET somersault рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдирд╛рдо рд╣реИред


рдЬрд░рд╛ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред


 struct Foo : IBoo { int x; void Boo() { x = 666; } } IBoo boo = new Foo(); boo.Boo(); 

рдЬрдм рд╣рдо рдлреВ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдордиреЗ рдЗрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдЯрд╛рдЗрдк рд╡реЗрд░рд┐рдПрдмрд▓ рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рд░реЗрдлрд░реЗрдВрд╕ рдЯрд╛рдЗрдк рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд░рдЦрд╛ред рдЕрдЧрд▓рд╛, рдмреЙрдХреНрд╕рд┐рдВрдЧ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдЪрд░ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЯрд╛рдЗрдк рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреЛ, рдХреЙрд▓ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ:


 IBoo boo = (IBoo)(box_to_object)new Foo(); boo.Boo(); 

рдРрд╕реЗ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рдореВрд▓ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдкреНрд░рддрд┐ рдмрджрд▓рдиреА рд╣реЛрдЧреА:


 void Main() { var foo = new Foo(); foo.a = 1; Console.WriteLite(foo.a); // -> 1 IBoo boo = foo; boo.Boo(); // looks like changing foo.a to 10 Console.WriteLite(foo.a); // -> 1 } struct Foo: IBoo { public int a; public void Boo() { a = 10; } } interface IBoo { void Boo(); } 

рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рд╣рдо рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреЛрдб рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╕реЗ рдХреНрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ IBoo рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд╕реНрдЯ рджреЗрдЦреЗрдВред рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлреВ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рди рдХрд┐ рдХреЛрдИ рд╕рдВрд░рдЪрдирд╛ред рдлрд┐рд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рджреГрд╢реНрдп рд╡рд┐рднрд╛рдЬрди рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдВрд╢реЛрдзрди рдкрд░рд┐рдгрд╛рдо рдлреВ рдореЗрдВ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмреВ рдлреВ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИред рдпрд╣ рднреНрд░рд╛рдордХ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ рдХреЛрдб рдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддреЗ рд╣реИрдВред


рджреВрд╕рд░реА рдмрд╛рдд рдкрд┐рдЫрд▓реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рд╡рд╕реНрддреБ рд╕реЗ IBoo рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдФрд░ рдкреНрд░рдорд╛рдг рд╣реИ рдХрд┐ рдПрдХ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдпрд╛, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рдХреЗрд╡рд▓ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк C ++ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХрд╣реЗрдВрдЧреЗ, рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ред


рдЖрдк рдЖрдкрддреНрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рд╕рдЪ рдерд╛, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:


 var referenceToInteger = (IInt32)10; 

рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдПрдХ рд╡рд╕реНрддреБ рдорд┐рд▓реЗрдЧреА, рдмрд▓реНрдХрд┐ рдПрдХ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реБрдЖ рд╕рдВрджрд░реНрдн рд╣реЛрдЧрд╛ред рдпрд╣ рдЙрдирдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╣рд╛рди рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ (рдЕрд░реНрдерд╛рдд рдЙрдирдХреЗ рдореВрд▓реНрдп рдХреА рдЕрдЦрдВрдбрддрд╛) рдХреЗ рдкреВрд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрдЧрд╛ред рдЖрдЗрдП рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдиреАрдЪреЗ рд▓реЗ рдЬрд╛рдПрдВ!


 public sealed class Boxed<T> { public T Value; [MethodImpl(MethodImplOptions.AggressiveInlining)] public override bool Equals(object obj) { return Value.Equals(obj); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override string ToString() { return Value.ToString(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override int GetHashCode() { return Value.GetHashCode(); } } 

рд╣рдореЗрдВ рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдХрд╛ рдкреВрд░рд╛ рдПрдирд╛рд▓реЙрдЧ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рднреА рднрд╛рдЧреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗред


 var typedBoxing = new Boxed<int> { Value = 10 }; var pureBoxing = (object)10; 

рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрд╣реБрдд рдЖрдХрд░реНрд╖рдХ рдирд╣реАрдВ рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдмрдХрд╡рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛ рд▓рд╛рдЗрдиреЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдвреЗрд░ рдкрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рд╛рдорд╛рдиреНрдп рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдХреЛрдИ рдореЗрдореЛрд░реА рд╕рдлрд╛рдИ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛ рд╕реНрдореГрддрд┐ рдХреЛ рд╕реАрдзреЗ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдЬрдмрдХрд┐ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдлрд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 10% рдЕрдзрд┐рдХ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЕрдкрдиреЗ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрд░реАрдХреЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред


 struct Foo { public int x; public void ChangeTo(int newx) { x = newx; } } var boxed = new Boxed<Foo> { Value = new Foo { x = 5 } }; boxed.Value.ChangeTo(10); var unboxed = boxed.Value; 

рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рдЙрдкрдХрд░рдг рдорд┐рд▓рд╛ рд╣реИред рдЖрдЗрдП рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


  • рд╣рдорд╛рд░рд╛ Boxed<T> рдкреНрд░рдХрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реИ: рдвреЗрд░ рдкрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╣рд╛рдВ рдПрдХ рдорд╛рди рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдирдмреЙрдХреНрд╕ рдХрд░рдХреЗ, рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
  • рдпрджрд┐ рдЖрдк рдПрдХ рдмреЙрдХреНрд╕рд┐рдВрдЧ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рдВрджрд░реНрдн рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЬреАрд╕реА рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдЧрд╛;
  • рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдм рд╣рдо рдПрдХ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдмреБрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ;
  • рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо SOH / LOH рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд▓реНрдпреВ рдЯрд╛рдЗрдк рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдкрд╣рд▓реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдПрдХ рдирдпрд╛ рд╕рдВрджрд░реНрдн рдорд┐рд▓реЗрдЧрд╛ред

рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдпрд╛рддрд╛рдпрд╛рдд рдкреИрджрд╛ рдХрд░рдирд╛ рд╣реИред рд╡рд╕реНрддреБрдУрдВ рдХреА рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ, рдЬрд┐рд╕рдХрд╛ рдПрдХ рднрд╛рдЧ рдкреАрдврд╝реА рджрд░ рдкреАрдврд╝реА рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рд╣рдореЗрдВ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдХреА рд╕рдорд╕реНрдпрд╛ рдЖрддреА рд╣реИред рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдХрдЪрд░рд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╣рдо рдЗрд╕рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рдереЗред рд▓реЗрдХрд┐рди рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЖрд╡рд╛рдЧрдорди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд╣рд▓рд╛ рдЙрдкрд╛рдп рдкреВрд▓рд┐рдВрдЧ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ .NET somersault рдХрд╛ рдПрдХ рдЖрджрд░реНрд╢ рдЕрдВрдд рд╣реИред


 var pool = new Pool<Boxed<Foo>>(maxCount:1000); var boxed = pool.Box(10); boxed.Value=70; // use boxed value here pool.Free(boxed); 

рдЕрдм рдмреЙрдХреНрд╕рд┐рдВрдЧ рдПрдХ рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдореЗрдореЛрд░реА рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреАрд╡рди рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЦреБрдж рдХреЛ рд╡рд╛рдкрд╕ рдкреВрд▓ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдмреЙрдХреНрд╕рд┐рдВрдЧ рд╕рдВрд░рдЪрдирд╛ рдЖрдкрдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдкрд░ рдЬрд╛рддреА рд╣реИ рдФрд░ рдЬрдм рдЖрдк рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЬреАрд╕реА рдХреЗ рджреМрд░рд╛рди рдкреВрд▓ рдореЗрдВ рдЦреБрдж рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ рджреЗрдЧрд╛ред


рдЖрдЗрдП рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ:


  • рдпрджрд┐ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдЖрдХрд╕реНрдорд┐рдХ рд╣реИ рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдРрд╕рд╛ рди рдХрд░реЗрдВред рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИред
  • рдпрджрд┐ рдХрд┐рд╕реА рд╕рд┐рд╕реНрдЯрдо рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП рдмреЙрдХреНрд╕рд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рд╡реЗрд░рд┐рдПрдВрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдмреЙрдХреНрд╕рд┐рдВрдЧ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рдЫреЛрдЯрд╛ рдФрд░ рд▓рдЧрднрдЧ рдЕрджреГрд╢реНрдп рд╣реИ, рддреЛ рдЖрдк рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЯреНрд░реИрдлрд╝рд┐рдХ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдХрд┐рд╕реА рдПрдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреА рдкреВрд▓рд┐рдВрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреБрдЫ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рдЕрдзрд┐рднрд╛рд░ рдХреЗ рдЬреАрд╕реА рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ;

рдЕрдВрддрддрдГ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:


 static unsafe void Main() { // here we create boxed int object boxed = 10; // here we get the address of a pointer to a VMT var address = (void**)EntityPtr.ToPointerWithOffset(boxed); unsafe { // here we get a Virtual Methods Table address var structVmt = typeof(SimpleIntHolder).TypeHandle.Value.ToPointer(); // change the VMT address of the integer passed to Heap into a VMT SimpleIntHolder, turning Int into a structure *address = structVmt; } var structure = (IGetterByInterface)boxed; Console.WriteLine(structure.GetByInterface()); } interface IGetterByInterface { int GetByInterface(); } struct SimpleIntHolder : IGetterByInterface { public int value; int IGetterByInterface.GetByInterface() { return value; } } 

рдХреЛрдб рдПрдХ рдЫреЛрдЯреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рд╕реВрдЪрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреАрдереВрдм рдкрддреЗ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдмреЙрдХреНрд╕рд┐рдВрдЧ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЗрдВрдЯ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЪрд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:


  1. рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд░реЗрдВред
  2. рдкреНрд░рд╛рдкреНрдд рд╡рд╕реНрддреБ рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (Int32 VMT рдХрд╛ рдкрддрд╛)
  3. рдПрдХ SimpleIntHolder рдХрд╛ VMT рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
  4. рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ VMT рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ VMT рдХреЛ рдмрджрд▓реЗрдВред
  5. рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд░реЗрдВ
  6. рд╕реНрдХреНрд░реАрди рдкрд░ рдлрд╝реАрд▓реНрдб рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ, рдЬреЛ рдЗрдВрдЯ 32 рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рдерд╛
    рдмреЙрдХреНрд╕рд┐рдВрдЧред

рдореИрдВ рдЗрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛
рдЗрд╕ рддрд░рд╣ред


рдЕрд╢рдХреНрдд \ _ <рдЯреА>


рдпрд╣ рдЕрд╢рдХреНрдд рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред Nullable value type рдХреА рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдмрд╣реБрдд рд╣реА рдЖрдХрд░реНрд╖рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╡реИрд▓реНрдпреВ рдЯрд╛рдЗрдк рдХрд╛ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрд╢рдХреНрдд рд░рд┐рдЯрд░реНрди null рд╣реИред


 int? x = 5; int? y = null; var boxedX = (object)x; // -> 5 var boxedY = (object)y; // -> null 

рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдЕрдЬреАрдм рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ: рдХреНрдпреЛрдВрдХрд┐ рдЕрд╢рдХреНрдд рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдПрдХ
рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреЙрдХреНрд╕рд┐рдВрдЧ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:


 int? x = null; var pseudoBoxed = (object)x; double? y = (double?)pseudoBoxed; 

рдХреЛрдб рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ
рдЕрд╢рдХреНрдд рдХреЗ рд╕рд╛рдеред


рдмреЙрдХреНрд╕рд┐рдВрдЧ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ


рдЕрдВрддрд┐рдо рдмрд┐рдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ System.Enum рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╣реИ: рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдирд╛рдо рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдирд╛рдоред рд╣рд╛рд▓рд╛рдБрдХрд┐, System.Enum рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд╣реИред рдЖрдкрдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рднреА Enum рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░, System.Enum рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣реИ, рдЬрд┐рд╕реЗ System.ValueType рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред


  [Serializable] [System.Runtime.InteropServices.ComVisible(true)] public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible { // ... } 

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рднреА рдЧрдгрдирд╛ рдПрд╕рдУрдПрдЪ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдЬрдм рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдвреЗрд░ рдФрд░ рдЬреАрд╕реА рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЕрднреА рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЧрдгрдирд╛ рдХрд╛ рдПрдХ рдкреВрд▓ рд╣реИ рдФрд░ рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рдЙрдирдХреЗ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддреЗ рд╣реИрдВред рдирд╣реАрдВ, рдлрд┐рд░ рд╕реЗред рдЖрдк рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧрдгрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЦреНрдпрд╛ рд╣реИред


рд╕рдЪреНрдЪрд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рд╕реАрдПрд▓рдЖрд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╣реИрдХ рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЛ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ :


 // Check to see if the class is a valuetype; but we don't want to mark System.Enum // as a ValueType. To accomplish this, the check takes advantage of the fact // that System.ValueType and System.Enum are loaded one immediately after the // other in that order, and so if the parent MethodTable is System.ValueType and // the System.Enum MethodTable is unset, then we must be building System.Enum and // so we don't mark it as a ValueType. if(HasParent() && ((g_pEnumClass != NULL && GetParentMethodTable() == g_pValueTypeClass) || GetParentMethodTable() == g_pEnumClass)) { bmtProp->fIsValueClass = true; HRESULT hr = GetMDImport()->GetCustomAttributeByName(bmtInternal->pType->GetTypeDefToken(), g_CompilerServicesUnsafeValueTypeAttribute, NULL, NULL); IfFailThrow(hr); if (hr == S_OK) { SetUnsafeValueClass(); } } 

рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реЛ? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХрд╛ рд╡рд┐рдЪрд╛рд░ - рдПрдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдПрдиреБрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд╛рд░рд┐рд╕ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЗрд╕реЗ рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред


рдпрджрд┐ рдЖрдк рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдХреНрдХреЗрдмрд╛рдЬреА рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?


рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдкрдХреЛ рдПрдХ disassembler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдХреЛрдб рдЬрдВрдЧрд▓ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реЗ .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЛрд░ рдХреЗ рдкрд╛рда рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ CLR рдФрд░ CoreCLR рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВред рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:


  • рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдПрдХ рдЕрд▓рдЧ рд╕рдореВрд╣ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
    рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░:
    • JIT_BoxFastMP_InlineGetThread
      (AMD64 - рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд░ рдпрд╛ рд╕рд░реНрд╡рд░ рдЬреАрд╕реА, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдереНрд░реЗрдб рд▓реЛрдХрд▓ рд╕реНрдЯреЛрд░реЗрдЬ)
    • JIT_BoxFastMP
      (рдПрдПрдордбреА ремрек - рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд░ рдпрд╛ рд╕рд░реНрд╡рд░ рдЬреАрд╕реА)
    • JIT_BoxFastUP
      (AMD64 - рд╕рд┐рдВрдЧрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдпрд╛ рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди GC)
    • JIT_TrialAlloc :: рдЬреЗрдирдмреЙрдХреНрд╕ (..)
      (x86) рдЬреАрдереЗрд▓рдкрд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ
  • рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдЬреЗрдЖрдИрдЯреА рдПрдХ рд╣реЗрд▓реНрдкрд░ рдлрдВрдХреНрд╢рди рдХреА рдХреЙрд▓ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ
    рдХрдВрдкрд╛рдЗрд▓рд░ :: impImportAndPushBox (..)
  • рд╕рд╛рдорд╛рдиреНрдп-рд╕рдВрд╕реНрдХрд░рдг рдХрдо рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
    MethodTable :: рдмреЙрдХреНрд╕ (..)
    • рдЕрдВрдд рдореЗрдВ, [CopyValueClassUnchecked (..)] рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
      ( https://github.com/dotnet/coreclr/blob/master/src/vm/object.cpp#L1514-L1581 )ред
      рдЗрд╕рдХреЗ рдХреЛрдб рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ 8 рдмрд╛рдЗрдЯ рд╡рд╛рд▓реЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЪреБрдирдирд╛ рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИред

рдпрд╣рд╛рдБ, рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
JIT_Unbox (..) , рдЬреЛ JIT_Unbox_Helper (..) рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рдЖрд╡рд░рдг рд╣реИред


рдпрд╣ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ ( https://stackoverflow.com/questions/3743762/unboxing-does-not-create-a-copy-of-the-value-is-this-right ), рдирдХрд▓ рдХрд╛ рдорддрд▓рдм рдирдХрд▓ рдирд╣реАрдВ рд╣реИ рдвреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ред рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдХреВрд▓рддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕реВрдЪрдХ рдХреЛ рдвреЗрд░ рддрдХ рдкрд╣реБрдВрдЪрд╛рдирд╛ред рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рдж IL opcode рдЗрд╕ рдкрддреЗ рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ред рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдпрд╛ рд╕реНрдЯреИрдХ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛрд╣рд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╣реЛрдЧреА; рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рдХрд╣реАрдВ рд╕реЗ рдвреЗрд░ рдХреА рдирдХрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЧрдВрддрд╡реНрдп рд╕реНрдерд╛рди рдкрд░ рдХреЙрдкреА рдХрд░ рд░рд╣рд╛ рд╣реИред


рдкреНрд░рд╢реНрди


рдХреНрдпреЛрдВ .NET CLR рдЦреБрдж рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдХреЗ рд▓рд┐рдП рдкреВрд▓рд┐рдВрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?


рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЛ рдмрд╛рддреЗрдВ рдЬрд╛рдиреЗрдВрдЧреЗ:


  • рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рднреА рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдмреЙрдХреНрд╕рд┐рдВрдЧ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рдЗрдВрдЯреЗрдЧрд░ рднреА рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
  • рдЕрдиреБрдХреВрд▓рди рдХреЗ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП -128 рд╕реЗ 127 рддрдХ рдХреЗ рд╕рднреА рдкреВрд░реНрдгрд╛рдВрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреВрд▓ рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВред

рддреЛ, рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди .NET CLR рдореЗрдВ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ? рдпрд╣ рд╕рд░рд▓ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 object x = 1; x.GetType().GetField("m_value", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(x, 138); Console.WriteLine(x); // -> 138 

рдпрд╛ рдЗрд╕ рддрд░рд╣ (C ++ / CLI):


 void ChangeValue(Object^ obj) { Int32^ i = (Int32^)obj; *i = 138; } 

рдпрджрд┐ рд╣рдо рдкреВрд▓рд┐рдВрдЧ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рднреА рдХреЛ рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ рдмрджрд▓рдХрд░ 138 рдХрд░ рджреЗрдВрдЧреЗ, рдЬреЛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред


рдЕрдЧрд▓рд╛ .NET рдореЗрдВ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рд╛рд░ рд╣реИред рд╡реЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореБрдХреНрдХреЗрдмрд╛рдЬреА рджреБрд░реНрд▓рдн рд╣реИ рдФрд░ рдмреЙрдХреНрд╕рд┐рдВрдЧ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд▓реНрдкрдирд╛ рдФрд░ рдмреБрд░реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрд╣ рдмрд┐рд▓рдХреБрд▓ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред


рдвреЗрд░ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдЯреИрдХ рдкрд░ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд░рдирд╛ рдХреНрдпреЛрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЬрдм рдЖрдк рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╣рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░ рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рд╣реИ?


рдпрджрд┐ рд╕реНрдЯреИрдХ рдкрд░ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрджрд░реНрдн рдвреЗрд░ рдкрд░ рдЬрд╛рдПрдЧрд╛, рддреЛ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рд╕рдВрджрд░реНрдн рдХрд╣реАрдВ рдФрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╕рдВрджрд░реНрдн рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд░рдЦ рд╕рдХрддреА рд╣реИред рд╡рд┐рдзрд┐ рддрдм рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреА, рдФрд░ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рднреА рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреАред рдирддреАрдЬрддрди, рд╕рдВрджрд░реНрдн рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдореГрдд рд╕реНрдерд╛рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ред


рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреНрдпреЛрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ?


рдХрднреА-рдХрднреА рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╛ рд╕рд░рд▓: рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореБрдЭрд╕реЗ рдордд рдкреВрдЫреЛ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЙрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреБрдирд░рд╛рд╡рд░реНрддрди рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдЕрдирдВрдд рдЖрдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдХреБрдЫ рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк рдЗрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг System.Char , рдЬрд┐рд╕рдореЗрдВ рд╕реНрд╡рдпрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ :


 public struct Char : IComparable, IConvertible { // Member Variables internal char m_value; //... } 

рд╕рднреА рд╕реАрдПрд▓рдЖрд░ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╣рдо, рдХреЗрд╡рд▓ рдирд╢реНрд╡рд░, рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рд╕реАрдПрд▓рдЖрд░ рдореЗрдВ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреА рднрд╛рд╡рдирд╛ рдХреЛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдпрд╣ рдЕрдиреБрд╡рд╛рджрдХ рдкреЗрд╢реЗрд╡рд░ рдЕрдиреБрд╡рд╛рджрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦрдХ рдХреА рднрд╛рд╖рд╛ рд╕реЗ рд░реВрд╕реА рд╕реЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реИ ред рдЖрдк рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рда рдХреЗ рд░реВрд╕реА рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреАрдиреА рдпрд╛ рдЬрд░реНрдорди рд╕рд╣рд┐рдд рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдЗрд╕ рдкрд╛рда рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк "рдзрдиреНрдпрд╡рд╛рдж" рдХрд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЬреЛ рдЖрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рд╣рдореЗрдВ рдЬреАрдердм рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдПрдХ рд╕реНрдЯрд╛рд░ рджреЗ рд░рд╣рд╛ рд╣реИред https://github.com/sidristij/dotnetbook

Source: https://habr.com/ru/post/hi439490/


All Articles