C # 8.0 рдореЗрдВ рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рд░реЗрдлрд░реА рд╕рдВрд░рдЪрдирд╛


рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ C # 8.0 рдореЗрдВ рдЗрд╕ рдЖрдЧрд╛рдореА рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреНрд▓реЙрдЧ рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ (рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди 2 рд╕рдВрд╕реНрдХрд░рдг):


тАЬрд╕реНрдЯреИрдХ-рдУрдирд▓реА рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕реА # 7.2 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рд╡реЗ рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рд╕реЗ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ред рдЕрдм рдЖрдИрдбреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд▓рд┐рдВрдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЙрдирдХреЗ рдЕрдВрджрд░ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред "


рддреЛ рдпрд╣ рд╣реИ: рд╕реНрдЯреИрдХ-рдУрдирд▓реА рд░рд┐рдл рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдЙрдирдХреА рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡реЗ рдЖрдИрдбреАрд╕реЛрдкрд╛рдпрд░реА рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдФрд░ рд╣рдо рдЗрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдерди рдореЗрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


class Program { static void Main(string[] args) { using (var book = new Book()) { Console.WriteLine("Hello World!"); } } } ref struct Book : IDisposable { public void Dispose() { } } 

рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рдПрдЧреА :


 Error CS8343 'Book': ref structs cannot implement interfaces 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдм рдпрджрд┐ рд╣рдо рд╕рдВрджрд░реНрдн рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ Dispose рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ using рдХрдерди рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛:


 class Program { static void Main(string[] args) { using (var book = new Book()) { // ... } } } ref struct Book { public void Dispose() { } } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрдпрд╛рди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЕрдм рдЖрдк рдЫреЛрдЯреЗ рд░реВрдк рдореЗрдВ (рддрдерд╛рдХрдерд┐рдд рдШреЛрд╖рдгрд╛рдУрдВ using ) рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 class Program { static void Main(string[] args) { using var book = new Book(); // ... } } 

рд▓реЗрдХрд┐рди ... рдХреНрдпреЛрдВ?


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


рдЗрд╕рд▓рд┐рдП, рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╕рдордп рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдлрд╛рдИ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред C # рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ IDisposable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдЗрд╕рдХреА Dispose рд╡рд┐рдзрд┐ рд╣реИред


рдиреЛрдЯред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╕рдВрджрд░реНрдн рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рд╕рдлрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╛рдЗрдирд▓ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЙрдирдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реИред


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


 public unsafe ref struct UnmanagedArray<T> where T : unmanaged { private T* data; public UnmanagedArray(int length) { data = // get memory from some pool } public ref T this[int index] { get { return ref data[index]; } } public void Dispose() { // return memory to the pool } } 

рдЪреВрдВрдХрд┐ рдЖрд╡рд░рдг рдореЗрдВ рдПрдХ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдкреЛрдЬрд╝ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рддреЛ рдЙрджрд╛рд╣рд░рдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:


 static void Main(string[] args) { var array = new UnmanagedArray<int>(10); Console.WriteLine(array[0]); array.Dispose(); } 

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


рд▓реЗрдХрд┐рди C # 8.0 рдореЗрдВ, рдЖрдк рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдкреВрд░рд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ:


 static void Main(string[] args) { using (var array = new UnmanagedArray<int>(10)) { Console.WriteLine(array[0]); } } 

рдЗрд╕реА рд╕рдордп, рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ:


 static void Main(string[] args) { using var array = new UnmanagedArray<int>(10); Console.WriteLine(array[0]); } 

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЕрдиреНрдп рджреЛ рдЙрджрд╛рд╣рд░рдг (рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝реЗ рдЧрдП рдХреЛрдб рдХреЗ рдмрд╣реБрдд) CoreFX рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВред


рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг ValueUtf8Converter рд╕рдВрджрд░реНрдн рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рд░рдгреА рдкреВрд▓ рд╕реЗ рдмрд╛рдЗрдЯ [] рд╕рд░рдгреА рд▓рдкреЗрдЯрддрд╛ рд╣реИ:


 internal ref struct ValueUtf8Converter { private byte[] _arrayToReturnToPool; ... public ValueUtf8Converter(Span<byte> initialBuffer) { _arrayToReturnToPool = null; } public Span<byte> ConvertAndTerminateString(ReadOnlySpan<char> value) { ... } public void Dispose() { byte[] toReturn = _arrayToReturnToPool; if (toReturn != null) { _arrayToReturnToPool = null; ArrayPool<byte>.Shared.Return(toReturn); } } } 

рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг RegexWriter рд╣реИ, рдЬреЛ рджреЛ ValueListBuilder рд╕рдВрджрд░реНрдн рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рд░рдгреА рдкреВрд▓ рд╕реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВ):


 internal ref struct RegexWriter { ... private ValueListBuilder<int> _emitted; private ValueListBuilder<int> _intStack; ... public void Dispose() { _emitted.Dispose(); _intStack.Dispose(); } } 

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


рд╣рдЯрд╛рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрджрд░реНрднрд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдирд┐рдореНрди-рд╕реНрдерд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ C ++ рдореЗрдВ рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╕рдВрдмрдВрдзрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрдпрд╛рди рдХреЗ рджрд╛рдпрд░реЗ (рдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧреБрдВрдЬрд╛рдЗрд╢) рд╕реЗ рдкрд░реЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдмреЗрд╢рдХ, рдирд┐рдпрдорд┐рдд, рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ-рдЙрдиреНрдореБрдЦ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрддреЗ рд╕рдордп рд╡реЗ рдЕрдЪрд╛рдирдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди, рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдХреЛрдб рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рд╕рдореНрдореЗрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рднреА рд╣реИ:


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


All Articles