рд░реЗрдлрд░реА рд╕реНрдерд╛рдиреАрдп рдФрд░ рд░реЗрдлрд░реА C #: рдкреНрд░рджрд░реНрд╢рди рдиреБрдХрд╕рд╛рди рдореЗрдВ

рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рд╕реЗ, рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд╕реА # рд╕рдорд░реНрдерд┐рдд рдкрд╛рд╕рд┐рдВрдЧ рддрд░реНрдХред рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 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(); // X has been changed! Assert.That(ma[0].X, Is.EqualTo(2)); var ml = new List<Mutable> {new Mutable(1)}; ml[0].IncrementX(); // X hasn't been changed! Assert.That(ml[0].X, Is.EqualTo(1)); } 

рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕реВрдЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕реЗ рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реИред

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

* рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд▓реНрдж рд╣реА рджреЗрдЦреЗрдВрдЧреЗ, рд╕реВрдЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЕрднреА рднреА рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдПрдХ рддрддреНрд╡ рдирд╣реАрдВ рд▓реМрдЯрд╛ рд╕рдХрддреА рд╣реИред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдорд╛ [0] .IncrementX () рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддрд╛ рд╣реИ рдЬреЛ рд╕рд░рдгреА рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ ml [0] .IncrementX () рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рд╕реВрдЪреА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рддрддреНрд╡ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╡рд╛рдкрд╕реА рдорд╛рди рдФрд░ рд╕рдВрджрд░реНрдн рд╕реНрдерд╛рдиреАрдп рдЪрд░: рдореВрд▓ рдмрд╛рддреЗрдВ


рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЕрд░реНрде рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рд▓реМрдЯрд╛рдП рдЧрдП рд╕рдВрджрд░реНрдн рдорд╛рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдЪрд░ рдХреЗ рдЙрдкрдирд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрджрд░реНрдн рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдРрд╕реЗ рдЙрдкрдирд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

1. рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:

 [Test] public void RefLocalsAndRefReturnsBasics() { int[] array = { 1, 2 }; // Capture an alias to the first element into a local ref int first = ref array[0]; first = 42; Assert.That(array[0], Is.EqualTo(42)); // Local function that returns the first element by ref ref int GetByRef(int[] a) => ref a[0]; // Weird syntax: the result of a function call is assignable GetByRef(array) = -1; Assert.That(array[0], Is.EqualTo(-1)); } 

2. рд▓реМрдЯреЗ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдпреЛрдВ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрдХ

рд▓реМрдЯрд╛рдП рдЧрдП рд╕рдВрджрд░реНрдн рдорд╛рди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдлрд╝реАрд▓реНрдб рдХреЗ рдЕрдиреНрдп рдирд╛рдо рдХреЛ рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ C # рд╕рдВрд╕реНрдХрд░рдг 7.2 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдХреЗ, рдЖрдк рд░рд┐рдбреНрдпреВрдирд▓реА рдореЙрдбрд┐рдлрд╝рд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдирд╛рдо рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class EncapsulationWentWrong { private readonly Guid _guid; private int _x; public EncapsulationWentWrong(int x) => _x = x; // Return an alias to the private field. No encapsulation any more. public ref int X => ref _x; // Return a readonly alias to the private field. public ref readonly Guid Guid => ref _guid; } [Test] public void NoEncapsulation() { var instance = new EncapsulationWentWrong(42); instance.X++; Assert.That(instance.X, Is.EqualTo(43)); // Cannot assign to property 'EncapsulationWentWrong.Guid' because it is a readonly variable // instance.Guid = Guid.Empty; } 

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

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] // R# 2017.3.2 is completely confused with this syntax! // => ref (idx >= _length ? ref Throw() : ref _data[idx]); { get { // Extracting 'throw' statement into a different // method helps the jitter to inline a property access. if ((uint)idx >= (uint)_length) ThrowIndexOutOfRangeException(); return ref _data[idx]; } } private static void ThrowIndexOutOfRangeException() => throw new IndexOutOfRangeException(); } struct LargeStruct_48 { public int N { get; } private readonly long l1, l2, l3, l4, l5; public LargeStruct_48(int n) : this() => N = n; } // Other structs like LargeStruct_16, LargeStruct_32 etc 

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

 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; // Using elementsCound but not array.Length to force the bounds check // on each iteration. for (int i = 0; i < elementsCount; i++) { result = _array48[i].N; } return result; } 

рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:



рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХреБрдЫ рдЧрд▓рдд рд╣реИ! рд╣рдорд╛рд░реЗ NaiveImmutableList <T> рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╕реВрдЪреА рдХреЗ рд╕рдорд╛рди рд╣реИред рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?

рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдорд╛рди рд▓реМрдЯрд╛рдПрдБ: рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, NaiveImmutableList <T> рдЗрдВрдбреЗрдХреНрд╕ рдХреЗрд╡рд▓ рд░реАрдб рд░реАрдбрдСрди рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд▓рд┐рдВрдХ-рдХреЗрд╡рд▓ рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрдЧреНрд░рд╣ рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╣рдо рдЬрд┐рди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рди рдХреЗрд╡рд▓ рдкрдардиреАрдп рд╣реИрдВред

рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╣рдореЗрдВ рдореВрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛:

 [Test] public void CheckMutabilityForNaiveImmutableList() { var ml = new NaiveImmutableList<Mutable>(new Mutable(1)); ml[0].IncrementX(); // X has been changed, right? Assert.That(ml[0].X, Is.EqualTo(2)); } 

рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓! рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ "рд░реАрдб-рдУрдирд▓реА рд▓рд┐рдВрдХреНрд╕" рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЙрдбрд┐рдлрд╛рдпрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рдорд╛рди рд╣реИ: рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рд░ рдмрд╛рд░ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ рдЬрдм рдПрдХ рд╕рдВрд░рдЪрдирд╛ рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдорд┐рд▓реАрд▓реАрдЯрд░ [рдХреЛ реж]ред рдЕрднреА рднреА рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЙрд▓ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред

рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред 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 { // Other fields public int X { get; } public int Y { get; } } private BigStruct _bigStruct; public ref readonly BigStruct GetBigStructByRef() => ref _bigStruct; ref readonly var bigStruct = ref GetBigStructByRef(); int result = bigStruct.X + bigStruct.Y; 

рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬрдм рдмрд┐рдЧрд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИред рд▓рдХреНрд╖реНрдп рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдмрд┐рдЧрд╕реНрдЯреНрд░рдХреНрдЯ рд░рд┐рдЯрд░реНрдиред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЪреВрдВрдХрд┐ BigStruct рд╕рдВрд░рдЪрдирд╛ рд▓реЗрдЦрди рдпреЛрдЧреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЗрдЯрдо рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╣рд░ рдмрд╛рд░ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред

рдЕрдиреБрдХреНрд░рдорд┐рдд рдореЗрдВ рд▓реМрдЯреЗ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдкреНрд░рдпрд╛рд╕ рдирдВрдмрд░ 2


рдЖрдЗрдП рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреА рдХреЗрд╡рд▓-рдкрдарди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рд╣реА рд╕реЗрдЯ рдЖрдЬрд╝рдорд╛рдПрдБ:



рдЕрдм рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдмрдбрд╝реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рдЕрднреА рднреА рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 100 рд╣рдЬрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдмрдбрд╝реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдм NaiveimmutableList <T> рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо T [] рдХреЗ рд╕рдордп рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ рдФрд░ рд╕реВрдЪреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


  • рд▓реМрдЯрд╛рдП рдЧрдП рд╕рдВрджрд░реНрдн рдорд╛рдиреЛрдВ рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
  • рд░реАрдбрдСрдирд▓реА рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рд▓реМрдЯреЗ рд╕рдВрджрд░реНрдн рдорд╛рди рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рд╣реИрдВред рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
  • рдЬрдм рд▓реЗрдЦрди рдпреЛрдЧреНрдп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рд░ рдмрд╛рд░ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рд░реАрдбрд╛рдпрдирд▓реА рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рджрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рдорд╛рди рдПрдХ рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред

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

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

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


All Articles