рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рд╕реЗ, рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд╕реА # рд╕рдорд░реНрдерд┐рдд рдкрд╛рд╕рд┐рдВрдЧ рддрд░реНрдХред рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 7 рд╕реЗ рдкрд╣рд▓реЗ, рд╕реА # рд╕рдВрдХрд▓рдХ рдиреЗ рдПрдХ рд╡рд┐рдзрд┐ (рдпрд╛ рд╕рдВрдкрддреНрддрд┐) рд╕реЗ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ - рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕реАред C # 7 рдореЗрдВ, рджреЛ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЧрдИ рд╣реИ: рдкреНрд░рддрд┐рдлрд▓ рдФрд░ рд╕реНрдерд╛рдиреАрдп рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░реЗрдВред рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдХрдЯ рдХреЗ рддрд╣рддред

рдХрд╛рд░рдгреЛрдВ
рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмреАрдЪ рдХрдИ рдЕрдВрддрд░ рд╣реИрдВред рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рд╕реЗ, рд╕реАрдПрд▓рдЖрд░ рдиреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реАрдПрд▓рдЖрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдФрд░ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рднреА рд╣реИ: рд╕рд░рдгреА рдЗрдВрдбреЗрдХреНрд╕рд░ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡реЛрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдореВрд▓реНрдп рд╕реЗ рдирд╣реАрдВред
рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рд╖рд┐рджреНрдз рд╡рд┐рдзрд┐ рдХреА рдУрд░ рдореБрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ - рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
public struct Mutable { private int _x; public Mutable(int x) => _x = x; public int X => _x; public void IncrementX() { _x++; } } [Test] public void CheckMutability() { var ma = new[] {new Mutable(1)}; ma[0].IncrementX();
рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕реВрдЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕реЗ рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реИред
рд╕реА # рдХрдВрдкрд╛рдЗрд▓рд░ рдПрд░реЗ рдЗрдВрдбреЗрдХреНрд╕рд░ - рд▓реЗрдбрд▓реЗрдорд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдПрд░реЗ рдХреЗ рдПрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИред рдореВрд▓рддрдГ, рдПрдХ рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдПрдХ рддрддреНрд╡ рдХреЛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реВрдЪреА рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ C # рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рдЙрдкрдирд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рд╕реВрдЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рдорд╛рди рд╕реЗ рд▓реМрдЯрд╛рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдЗрд╕ рддрддреНрд╡ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рддреА рд╣реИред
* рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд▓реНрдж рд╣реА рджреЗрдЦреЗрдВрдЧреЗ, рд╕реВрдЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЕрднреА рднреА рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдПрдХ рддрддреНрд╡ рдирд╣реАрдВ рд▓реМрдЯрд╛ рд╕рдХрддреА рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдорд╛ [0] .IncrementX () рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддрд╛ рд╣реИ рдЬреЛ рд╕рд░рдгреА рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ ml [0] .IncrementX () рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рд╕реВрдЪреА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рддрддреНрд╡ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╡рд╛рдкрд╕реА рдорд╛рди рдФрд░ рд╕рдВрджрд░реНрдн рд╕реНрдерд╛рдиреАрдп рдЪрд░: рдореВрд▓ рдмрд╛рддреЗрдВ
рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЕрд░реНрде рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рд▓реМрдЯрд╛рдП рдЧрдП рд╕рдВрджрд░реНрдн рдорд╛рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдЪрд░ рдХреЗ рдЙрдкрдирд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрджрд░реНрдн рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдРрд╕реЗ рдЙрдкрдирд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
1. рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:
[Test] public void RefLocalsAndRefReturnsBasics() { int[] array = { 1, 2 };
2. рд▓реМрдЯреЗ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдпреЛрдВ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрдХ
рд▓реМрдЯрд╛рдП рдЧрдП рд╕рдВрджрд░реНрдн рдорд╛рди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдлрд╝реАрд▓реНрдб рдХреЗ рдЕрдиреНрдп рдирд╛рдо рдХреЛ рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ C # рд╕рдВрд╕реНрдХрд░рдг 7.2 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдХреЗ, рдЖрдк рд░рд┐рдбреНрдпреВрдирд▓реА рдореЙрдбрд┐рдлрд╝рд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдирд╛рдо рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
class EncapsulationWentWrong { private readonly Guid _guid; private int _x; public EncapsulationWentWrong(int x) => _x = x;
- рддрд░реАрдХреЗ рдФрд░ рдЧреБрдг рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ "рдЙрдкрдирд╛рдо" рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрдиреЗ рд╕реЗ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
- рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
- рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЧреИрд░-рдорд╛рдирдХ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред
3. рдореМрдЬреВрджрд╛ рдкреНрд░рддрд┐рдмрдВрдзред рдПрдХ рдЙрдкрдирд╛рдо рд▓реМрдЯрдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рд╡рд┐рдзрд┐ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдвреЗрд░ рдкрд░ рд░рдЦреЗ рдЧрдП рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, C # рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
- рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдеред
- рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдеред
- рдЖрдк рдвреЗрд░ рдкрд░ рд╕реНрдерд┐рдд рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдХреЗ рд▓рд┐рдП)ред
- рдЖрдк рд░реЗрдлрд░реА / рдЖрдЙрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк
рд░реЗрдлрд░реА рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рдХрд╛рд╢рди
рд╕реЗрдл рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ, рд╡реНрд▓рд╛рджрд┐рдореАрд░ рд╕реИрдбреЛрд╡, рд╕реА # рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рд╕рдВрджрд░реНрдн рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИрдВред
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реМрдЯреЗ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдпреЛрдВ рдФрд░ рд╕рдВрджрд░реНрднрд┐рдд рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдиреБрдХреНрд░рдорд┐рдд рдореЗрдВ рд▓реМрдЯреЗ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо NaiveImmutableList <T> рдирд╛рдордХ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ T [] рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ (4, 16, 32 рдФрд░ 48) рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗред
public class NaiveImmutableList<T> { private readonly int _length; private readonly T[] _data; public NaiveImmutableList(params T[] data) => (_data, _length) = (data, data.Length); public ref readonly T this[int idx]
рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рд╕рднреА рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рд╕рднреА рдПрди рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:
private const int elementsCount = 100_000; private static LargeStruct_48[] CreateArray_48() => Enumerable.Range(1, elementsCount).Select(v => new LargeStruct_48(v)).ToArray(); private readonly LargeStruct_48[] _array48 = CreateArray_48(); [BenchmarkCategory("BigStruct_48")] [Benchmark(Baseline = true)] public int TestArray_48() { int result = 0;
рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХреБрдЫ рдЧрд▓рдд рд╣реИ! рд╣рдорд╛рд░реЗ NaiveImmutableList <T> рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╕реВрдЪреА рдХреЗ рд╕рдорд╛рди рд╣реИред рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?
рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдорд╛рди рд▓реМрдЯрд╛рдПрдБ: рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, NaiveImmutableList <T> рдЗрдВрдбреЗрдХреНрд╕ рдХреЗрд╡рд▓ рд░реАрдб рд░реАрдбрдСрди рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд▓рд┐рдВрдХ-рдХреЗрд╡рд▓ рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрдЧреНрд░рд╣ рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╣рдо рдЬрд┐рди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рди рдХреЗрд╡рд▓ рдкрдардиреАрдп рд╣реИрдВред
рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╣рдореЗрдВ рдореВрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛:
[Test] public void CheckMutabilityForNaiveImmutableList() { var ml = new NaiveImmutableList<Mutable>(new Mutable(1)); ml[0].IncrementX();
рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓! рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ "рд░реАрдб-рдУрдирд▓реА рд▓рд┐рдВрдХреНрд╕" рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЙрдбрд┐рдлрд╛рдпрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рдорд╛рди рд╣реИ: рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рд░ рдмрд╛рд░ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ рдЬрдм рдПрдХ рд╕рдВрд░рдЪрдирд╛ рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдорд┐рд▓реАрд▓реАрдЯрд░ [рдХреЛ реж]ред рдЕрднреА рднреА рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЙрд▓ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред
рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред C # рдХрдВрдкрд╛рдЗрд▓рд░ рдорд╛рди рдХреЗ рджреНрд╡рд╛рд░рд╛, рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛, рдФрд░ "рд░реАрдб рдУрдирд▓реА рд▓рд┐рдВрдХ" рдХреЛ рд╕рдВрд╢реЛрдзрдХ рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░рдХреЗ (рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ
) рдЗрди-рдореЛрдбрд┐рдлрд╛рдпрд░ рдФрд░ C # рдореЗрдВ рд░реАрдбрдСрдирд▓реА рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ ("рдЗрди рдореЙрдбрд┐рдлрд╝рд╛рдпрд░ рдПрдВрдб рд░реАрдб-рдУрдирд▓реА рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдЗрди рд╕реА" рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред "))ред рдЕрдм рд╕рдВрдХрд▓рдХ рдПрдХ рд╡рд┐рдзрд┐ рд╕реЗ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: рдореВрд▓реНрдп рд╕реЗ, рд╕рдВрджрд░реНрдн рд╕реЗ рдФрд░ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╕реЗред
рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдирд┐рдпрдорд┐рдд рд▓рд┐рдВрдХ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдкрдиреЗ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА InAttribute рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
private int _n; public ref readonly int ByReadonlyRef() => ref _n;
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, ByReadonlyRef рдкрджреНрдзрддрд┐ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд╕рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реИ:
[InAttribute] [return: IsReadOnly] public int* ByReadonlyRef() { return ref this._n; }
рд╕рдВрд╢реЛрдзрдХ рдФрд░ рд░реАрдб-рдУрдирд▓реА рд▓рд┐рдВрдХ рдХреЗ рдмреАрдЪ рд╕рдорд╛рдирддрд╛ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпреЗ рдХрд╛рд░реНрдп рдирд┐рдпрдорд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
public struct BigStruct {
рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬрдм рдмрд┐рдЧрд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИред рд▓рдХреНрд╖реНрдп рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдмрд┐рдЧрд╕реНрдЯреНрд░рдХреНрдЯ рд░рд┐рдЯрд░реНрдиред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЪреВрдВрдХрд┐ BigStruct рд╕рдВрд░рдЪрдирд╛ рд▓реЗрдЦрди рдпреЛрдЧреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЗрдЯрдо рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╣рд░ рдмрд╛рд░ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред
рдЕрдиреБрдХреНрд░рдорд┐рдд рдореЗрдВ рд▓реМрдЯреЗ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдкреНрд░рдпрд╛рд╕ рдирдВрдмрд░ 2
рдЖрдЗрдП рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреА рдХреЗрд╡рд▓-рдкрдарди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рд╣реА рд╕реЗрдЯ рдЖрдЬрд╝рдорд╛рдПрдБ:

рдЕрдм рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдмрдбрд╝реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рдЕрднреА рднреА рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 100 рд╣рдЬрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдмрдбрд╝реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдм NaiveimmutableList <T> рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо T [] рдХреЗ рд╕рдордп рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ рдФрд░ рд╕реВрдЪреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
- рд▓реМрдЯрд╛рдП рдЧрдП рд╕рдВрджрд░реНрдн рдорд╛рдиреЛрдВ рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
- рд░реАрдбрдСрдирд▓реА рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рд▓реМрдЯреЗ рд╕рдВрджрд░реНрдн рдорд╛рди рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рд╣реИрдВред рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
- рдЬрдм рд▓реЗрдЦрди рдпреЛрдЧреНрдп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рд░ рдмрд╛рд░ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рд░реАрдбрд╛рдпрдирд▓реА рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рджрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рдорд╛рди рдПрдХ рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред
рд▓реМрдЯрд╛рдП рдЧрдП рд╕рдВрджрд░реНрдн рдорд╛рди рдФрд░ рд╕рдВрджрд░реНрднрд┐рдд рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдФрд░ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦрддрд░рдирд╛рдХ рд╣реИрдВ: рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЗрдЯрдо рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП: рдПрдХ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд▓рд┐рдВрдХ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ "рдХреЙрд▓ рдХреЗ рдмрд┐рдВрджреБ рдкрд░" "ред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд╡реГрджреНрдзрд┐ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛, рдФрд░ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрд╕рдХреА рдЧрдВрднреАрд░ рдЧрд┐рд░рд╛рд╡рдЯ рд╣реЛрдЧреА рдпрджрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдПрдХ рд╕рдВрджрд░реНрдн рд╕реНрдерд╛рдиреАрдп рдЪрд░, рд░реАрдб-рдУрдирд▓реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
PS BCL рдореЗрдВ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред рдХреЛрд░рдЯреЗрдХреНрд╕ рд░реЗрдкреЛ (
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдЗрдЯрдорд░рдл рдПрдкреАрдЖрдИ рдкреНрд░рд╕реНрддрд╛рд╡ ("рдЖрдЗрдЯрдорд░рд┐рдл рдПрдкреАрдЖрдИ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡)) рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЖрдЗрдЯрдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рд░реЗрдлрд░реА рддрд░реАрдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рдереЗред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдм рдФрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред