рдореЗрдореЛрд░реА рдФрд░ рд╕реНрдкреИрди рдкреАрдЯреАред 1

.NET рдХреЛрд░ 2.0 рдФрд░ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.5 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ рд╣рдо рдирдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: Span рдФрд░ Memory ред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ System.Memory nuget рдкреИрдХреЗрдЬ рдХреЛ рд╕рдВрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


PM> Install-Package System.Memory

рдпреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ CLR рдЯреАрдо рдиреЗ рдЗрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреЛрд░ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдХреЗ .NET рдХреЛрд░ 2.1+ JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдпреЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдФрд░ рд╡реЗ рдкреВрд░реЗ рдЕрдзреНрдпрд╛рдп рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпреЛрдВ рд╣реИрдВ?


рдпрджрд┐ рд╣рдо рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЙрдирдореЗрдВ рд╕реЗ рддреАрди рдХрд╛ рдирд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓рд╛ рдПрдХ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рд╣реИред


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


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

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

рдордВрдЪ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЖрдпрд╛рддрд┐рдд рддрд░реАрдХреЛрдВ рдФрд░ рдорд╛рд░реНрд╢рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдСрдЯреЛ рд░реИрдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬреЛ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ stackalloc рд╕реЗ рднреА рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдПрдХ рдереНрд░реЗрдб рд╕реНрдЯреИрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдкрд╣рд▓реЗ C # рдбреЗрд╡рд▓рдкрд░реНрд╕ C ++ рджреБрдирд┐рдпрд╛ (рдореЗрд░рд╛ рдорд╛рдорд▓рд╛) рд╕реЗ рдЖрдП рдереЗ, рд▓реЗрдХрд┐рди рдЕрдм рд╡реЗ рдЕрдзрд┐рдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЧрдП (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдЬреЛ рдкрд╣рд▓реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдФрд░ рд╕реА / рд╕реА + рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдкрд░ рдЕрдзрд┐рдХ рд╕рдВрджреЗрд╣ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред


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


Interop.ReadDir рд╡рд░реНрдЧ
/src/mscorlib/shared/Interop/Unix/System.Native/Interop.ReadDir.cs


 unsafe { // s_readBufferSize is zero when the native implementation does not support reading into a buffer. byte* buffer = stackalloc byte[s_readBufferSize]; InternalDirectoryEntry temp; int ret = ReadDirR(dir.DangerousGetHandle(), buffer, s_readBufferSize, out temp); // We copy data into DirectoryEntry to ensure there are no dangling references. outputEntry = ret == 0 ? new DirectoryEntry() { InodeName = GetDirectoryEntryName(temp), InodeType = temp.InodeType } : default(DirectoryEntry); return ret; } 

рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд▓реЛрдХрдкреНрд░рд┐рдп рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред рдмрд╕ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕реНрдХрд┐рдо рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рд╕рд╡рд╛рд▓ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ 'рдирд╣реАрдВ' рд╣реИред рдлрд┐рд░, рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдХреНрдпреЛрдВ рдкреВрдЫреЗрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рди рдХреЗрд╡рд▓ рд╣рдо Dangerous рд╢рдмреНрдж рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди unsafe рдХреАрд╡рд░реНрдб рдФрд░ byte* buffer = stackalloc byte[s_readBufferSize]; рд▓рд╛рдЗрди (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ - byte* ) рдЬреЛ рд╣рдорд╛рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИред рдпрд╣ рд╕реЛрдЪрдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░рд┐рдЧрд░ рд╣реИ: "рдХреНрдпрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдерд╛"? рддреЛ, рдЪрд▓реЛ рдордиреЛрд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЙрддрд░реЗрдВ: рдЖрдк рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ? рдПрдХ рдУрд░, рд╣рдо рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддреБрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C ++ / CLI рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рдЬреЛ рдХреБрдЫ рднреА (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╢реБрджреНрдз рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ)ред рджреВрд╕рд░реА рдУрд░, рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрд╕рд╛рдорд╛рдиреНрдп рджрд┐рдЦрддрд╛ рд╣реИред


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


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


 int ParseInt(char[] input, int index) { while(char.IsDigit(input[index])) { // ... index++; } } 

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


 int ParseInt(IList<char>[] input) { while(char.IsDigit(input.Array[index])) { // ... index++; } } var arraySegment = new ArraySegment(array, from, length); var res = ParseInt((IList<char>)arraySegment); 

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


рддреЛ рд╣рдо рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ? рд╣рдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╖рдо рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреАрдХреГрдд рдФрд░ рддреНрд╡рд░рд┐рдд рдЙрдкрдХрд░рдг рджреЗрддреЗ рд╣реИрдВ: рд╕рд░рдгрд┐рдпрд╛рдБ, рддрд╛рд░ рдФрд░ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдореЗрдореЛрд░реАред рдЙрдиреНрд╣реЗрдВ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдХрд┐ рд╡реЗ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдХреЛрдИ рдЧрд▓рддреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЙрдиреНрд╣реЗрдВ рдПрдХ рдРрд╕рд╛ рдЙрдкрдХрд░рдг рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рджреЗрд╢реА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрдо рдирд╣реАрдВ рдХрд░рддрд╛ рд▓реЗрдХрд┐рди рд╕реВрдЪреАрдмрджреНрдз рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред Span<T> рдФрд░ Memory<T> рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЗ рдЙрдкрдХрд░рдг рд╣реИрдВред


рд╕реНрдкреИрди <рдЯреА>, рд░реАрдбрдСрдирд▓рд╕реНрдкреИрди <рдЯреА>


Span рдкреНрд░рдХрд╛рд░ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рд╕рд░рдгреА рдХреЗ рдПрдХ рдЦрдВрдб рдХреЗ рднреАрддрд░ рдпрд╛ рдЙрд╕рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдПрдХ рд╕рд░рдгреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЗрд╕ рд╕рдмрд░реЗрдВрдЬ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рджреЛрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдзрд╛ рдХреЗ рд╕рд╛рде: рдЖрдкрдХреЛ рдПрдХ Span<T> рдХреЗрд╡рд▓ рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдорд┐рд▓рддрд╛ рд╣реИ рдпрд╛ рдмрдирд╛рдирд╛ рд╣реИ, рдмрд╕ рддрд░реАрдХреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЗрдП рдЙрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдЬреЛ Span рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред


рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдбреЗрдЯрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рдгреА рд╣реИред рдирд┐рдореНрди рддрд░реАрдХреЗ рд╕реЗ Span рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


  var array = new [] {1,2,3,4,5,6}; var span = new Span<int>(array, 1, 3); var position = span.BinarySearch(3); Console.WriteLine(span[position]); // -> 3 

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


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


 void Main() { var array = new [] {'1','2','3','4','5','6'}; var span = new Span<char>(array, 1, 3); if(TryParseInt32(span, out var res)) { Console.WriteLine(res); } else { Console.WriteLine("Failed to parse"); } } public bool TryParseInt32(Span<char> input, out int result) { result = 0; for (int i = 0; i < input.Length; i++) { if(input[i] < '0' || input[i] > '9') return false; result = result * 10 + ((int)input[i] - '0'); } return true; } ----- 234 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ Span<T> рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрдореЛрд░реА рд░реЗрдВрдЬ рдХрд╛ рд╕рд╛рд░ рдПрдХреНрд╕реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ? рдЕрдЧрд░ рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рд╣рдо Span рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рдФрд░ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рддрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВрдЧреЗ:


 // Managed array var array = new[] { '1', '2', '3', '4', '5', '6' }; var arrSpan = new Span<char>(array, 1, 3); if (TryParseInt32(arrSpan, out var res1)) { Console.WriteLine(res1); } // String var srcString = "123456"; var strSpan = srcString.AsSpan(); if (TryParseInt32(strSpan, out var res2)) { Console.WriteLine(res2); } // void * Span<char> buf = stackalloc char[6]; buf[0] = '1'; buf[1] = '2'; buf[2] = '3'; buf[3] = '4'; buf[4] = '5'; buf[5] = '6'; if (TryParseInt32(buf, out var res3)) { Console.WriteLine(res3); } ----- 234 234 234 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ Span<T> рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдПрдХрдЬреБрдЯ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдФрд░ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реИред рдпрд╣ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдХреЗ рджреМрд░рд╛рди рдРрд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕реНрдореГрддрд┐ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рддреА рд╣реИ, рддреЛ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧреАред


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрддрдирд╛ рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддреЗ рдереЗ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рдмрдВрдзрд┐рдд рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ: рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рдФрд░ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╕рд░рдгреА рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╡рд┐рджреНрдпрдорд╛рди [ArraySegment] ( https://referencesource.microsoft.com/#mscorlib/system/ arraysegment.cs, 31 )) рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреЗ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╡рд╣ рдпрд╣ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЙрдирдХреЗ рдкрд╛рд╕ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рд╣реИрдВред рдлрд┐рд░, рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рдкреЗрдЯрдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдПрдХ рдмрдлрд░ рдФрд░ рдПрдХ рд╕рд░рдгреА рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╡ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдВрджрд░реНрдн рд░рдЦрдиреЗ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдХреЗрд╡рд▓ рдПрдХ рд╕рдХреНрд░рд┐рдп рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде, рдЬрд╛рд╣рд┐рд░ рд╣реИ)ред


 public readonly ref struct OurSpan<T> { private T[] _array; private string _str; private T * _buffer; // ... } 

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


рдЕрдЧрд▓рд╛, рдПрдХ рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ Span рд╕рдВрдмрдВрдз рдореЗрдВ ref struct рдХреНрдпрд╛ рд╣реИ? рдпреЗ рдмрд┐рд▓реНрдХреБрд▓ "рд╕реНрдЯреИрдХ рдкрд░ рдореМрдЬреВрдж рд╕рдВрд░рдЪрдирд╛рдПрдВ" рд╣реИрдВ рдЬреЛ рд╣рдо рдиреМрдХрд░реА рдХреЗ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рджреМрд░рд╛рди рдЗрддрдиреА рдмрд╛рд░ рд╕реБрдирддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдвреЗрд░ рддрдХ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ Span , рдЬреЛ рдПрдХ рд░реЗрдл рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╣реИ, рдПрдХ рд╕рдВрджрд░реНрдн рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рд▓реЗрдХрд┐рди рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд╣реАрдВред рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдЖрдзрд╛рд░ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред


рдЕрдм рд╣рдо Span рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд ReadOnlySpan рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


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

рджрд░рдЕрд╕рд▓, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреЛрдб рдЬреИрд╕рд╛ рд╣реИ


 public void Method1(Span<byte> buffer) { buffer[0] = 0; Method2(buffer.Slice(1,2)); } Method2(Span<byte> buffer) { buffer[0] = 0; Method3(buffer.Slice(1,1)); } Method3(Span<byte> buffer) { buffer[0] = 0; } 

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


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

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

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


All Articles