[рдбреЙрдЯрдиреЗрдЯрдмреБрдХ] рд╕реНрдкреИрди: рдирдИ .NET рдбреЗрдЯрд╛ рдЯрд╛рдЗрдк

рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рд╛рде, рдореИрдВ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк .NET рд╕реАрдПрд▓рдЖрд░ рдХреЗ рдХрд╛рдо рдкрд░ рдПрдХ рдкреБрд╕реНрддрдХ рд╣реЛрдЧреА, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ .NETред рдкреБрд╕реНрддрдХ рдХреЗ рд▓рдЧрднрдЧ 200 рдкреГрд╖реНрда рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ)ред


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


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


рдЯрд┐рдкреНрдкрдгреА


рд╣реИрдмреЗ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЕрдзреНрдпрд╛рдп рдЕрджреНрдпрддрди рдирд╣реАрдВ рд╣реИ рдФрд░, рд╢рд╛рдпрдж, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдереЛрдбрд╝рд╛ рдкреБрд░рд╛рдирд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП, рдХреГрдкрдпрд╛ рд╣рд╛рд▓ рдХреЗ рдкрд╛рда рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкрд░ рдЬрд╛рдПрдВ:



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


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


рддреЛ рд╕рд╡рд╛рд▓ рдХреНрдпрд╛ рд╣реИ? рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдорд╛рдирд╡ рд░рд╣рд┐рдд рдХреЛрдб рдХреА рд╡рд╛рдкрд╕ рдХреИрд╕реЗ рд▓реМрдЯрд╛рдПрдВ? рдЙрдиреНрд╣реЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╡реЗ рдЕрдЬреНрдЮрд╛рдирддрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдХрд░ рдЧрд▓рддреА рд╕реЗ рдЧрд▓рддреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рддреЛ, Span<T> рдФрд░ Memory<T> рдХреНрдпреЛрдВ 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().Slice(1, 3); 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.Slice(1, 3), out var res3)) { Console.WriteLine(res3); } ----- 234 234 234 

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


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


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

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


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, Span рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ ref struct рдХреНрдпрд╛ рд╣реИ? рдпреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╣реА "рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ, рд╡реЗ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдкрд░ рд╣реИрдВ," рдЬреЛ рд╣рдо рдЕрдХреНрд╕рд░ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рд╕реБрдирддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдвреЗрд░ рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП, 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 рдкреНрд░рдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рд╢реЗрд▓ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдеред


рдЙрджрд╛рд╣рд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрдкреИрди [рдЯреА]


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


ValueStringBuilder


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


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


рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рдЬреЛ рдореИрдВрдиреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧрдмреБрд▓рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ рдерд╛ рдЫреЛрдЯреЗ рддрд╛рд░реЛрдВ рдХрд╛ рдмрдирдирд╛ред рдпрд╛рдиреА рдЬрдм рдкрд░рд┐рдгрд╛рдо рдкрдВрдХреНрддрд┐ "рджрд╛рдВрдд рджреЗ" рдЫреЛрдЯреА рд╣реЛрдЧреА: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 100 рд╕реЗ рдХрдо рдЕрдХреНрд╖рд░ред рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдХрдо рдкреНрд░рд╛рд░реВрдкрдг рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ:


  $"{x} is in range [{min};{max}]" 

StringBuilder рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рдкреАрдврд╝реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рддрдирд╛ рдЦрд░рд╛рдм рд╣реИ? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИ: рдпрд╣ рд╕рдм рдЧрдарди рдХреА рдЬрдЧрд╣ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдм рдХреЗ рдмрд╛рдж, рдкрд╣рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ редormat рдЖрдВрддрд░рд┐рдХ StringBuilder рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдПрдЧрд╛ (SourceString.Length + args.Length * 8) рдФрд░ рдЕрдЧрд░ рд╕рд░рдгреА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд▓рдВрдмрд╛рдИ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдПрдХ рдФрд░ StringBuilder рдирд┐рд░рдВрддрд░рддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬрд┐рд╕рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реА рд╕реВрдЪреА рдмрдирддреА рд╣реИред рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЙрддреНрдкрдиреНрди рд▓рд╛рдЗрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛: рдФрд░ рдпрд╣ рдПрдХ рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╣реИред рднрдЯрдХрдирд╛ рдФрд░ рднрдЯрдХрдирд╛ред рдЕрдм, рдпрджрд┐ рд╣рдо рдвреЗрд░ рдкрд░ рдмрдирдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдкрд╣рд▓реЗ рд╕рд░рдгреА рдХреЛ рд░рдЦрдиреЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрджреНрднреБрдд рд╣реЛрдЧрд╛: рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВрдЧреЗред


mscorlib рдХреЗ mscorlib рд╕реЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:


рдХрдХреНрд╖рд╛ рдорд╛рди
/ src / mscorlib / рд╕рд╛рдЭрд╛ / рдкреНрд░рдгрд╛рд▓реА / рдкрд╛рда / ValueStringBuilder


  internal ref struct ValueStringBuilder { //           private char[] _arrayToReturnToPool; //     private Span<char> _chars; private int _pos; //    ,       public ValueStringBuilder(Span<char> initialBuffer) { _arrayToReturnToPool = null; _chars = initialBuffer; _pos = 0; } public int Length { get => _pos; set { int delta = value - _pos; if (delta > 0) { Append('\0', delta); } else { _pos = value; } } } //   -       public override string ToString() { var s = new string(_chars.Slice(0, _pos)); Clear(); return s; } //       //     :   public void Insert(int index, char value, int count) { if (_pos > _chars.Length - count) { Grow(count); } int remaining = _pos - index; _chars.Slice(index, remaining).CopyTo(_chars.Slice(index + count)); _chars.Slice(index, count).Fill(value); _pos += count; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Append(char c) { int pos = _pos; if (pos < _chars.Length) { _chars[pos] = c; _pos = pos + 1; } else { GrowAndAppend(c); } } [MethodImpl(MethodImplOptions.NoInlining)] private void GrowAndAppend(char c) { Grow(1); Append(c); } //   ,     //         //            //           [MethodImpl(MethodImplOptions.NoInlining)] private void Grow(int requiredAdditionalCapacity) { Debug.Assert(requiredAdditionalCapacity > _chars.Length - _pos); char[] poolArray = ArrayPool<char>.Shared.Rent(Math.Max(_pos + requiredAdditionalCapacity, _chars.Length * 2)); _chars.CopyTo(poolArray); char[] toReturn = _arrayToReturnToPool; _chars = _arrayToReturnToPool = poolArray; if (toReturn != null) { ArrayPool<char>.Shared.Return(toReturn); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] private void Clear() { char[] toReturn = _arrayToReturnToPool; this = default; // for safety, to avoid using pooled array if this instance is erroneously appended to again if (toReturn != null) { ArrayPool<char>.Shared.Return(toReturn); } } //  :       private void AppendSlow(string s); public bool TryCopyTo(Span<char> destination, out int charsWritten); public void Append(string s); public void Append(char c, int count); public unsafe void Append(char* value, int length); public Span<char> AppendSpan(int length); } 

рдпрд╣ рд╡рд░реНрдЧ рдЕрдкрдиреЗ рдмрдбрд╝реЗ рднрд╛рдИ StringBuilder рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рд╣реИред рдпрд╛рдиреА рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рддред рдФрд░ рдирд╡реАрдирддрдо ref рдкреНрд░рдХрд╛рд░ рд╕рдВрд╢реЛрдзрдХ, рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ: рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдкрд░ рд╣реЛрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИред рдпрд╛рдиреА рд╡рд░реНрдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдЧрд╛ред рдпреЗ рд╕рдм рд╕реНрдХреНрд╡рд╛рдЯреНрд╕ рдХреНрдпреЛрдВ? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ StringBuilder рдХреНрд▓рд╛рд╕ рдХреЛ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рдХрд╛ рд╕рд╛рд░ рд╣рдордиреЗ рдЕрднреА рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ:


рдХреНрд▓рд╛рд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧрдмрд░реНрд▓ / рдПрд╕рдХреЗрдПрд╕ / рдПрд╕рдПрдордПрд╕рд╕реНрдХреНрд▓рд┐рдм / рдПрд╕рд╕реАрд╡реА / рд╕рд┐рд╕реНрдЯрдо / рдЯреЗрдХреНрд╕реНрдЯ / рд╕реНрдЯреНрд░рд┐рдВрдЧрдмреБрд▓рд╕реНрдЯрд┐рдХреНрд╕ред


 public sealed class StringBuilder : ISerializable { // A StringBuilder is internally represented as a linked list of blocks each of which holds // a chunk of the string. It turns out string as a whole can also be represented as just a chunk, // so that is what we do. internal char[] m_ChunkChars; // The characters in this block internal StringBuilder m_ChunkPrevious; // Link to the block logically before this block internal int m_ChunkLength; // The index in m_ChunkChars that represent the end of the block internal int m_ChunkOffset; // The logical offset (sum of all characters in previous blocks) internal int m_MaxCapacity = 0; // ... internal const int DefaultCapacity = 16; 

StringBuilder рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рдХрдбрд╝реА рд╣реЛрддреА рд╣реИред рдпрд╛рдиреА рдЬрдм рдЖрдк рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдо рд╕реЗ рдХрдо рджреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ: рд╕реНрдЯреНрд░рд┐рдВрдЧрдмрд░реНрдмрд╕реНрдЯ рдЦреБрдж рдФрд░ рдХрдо рд╕реЗ рдХрдо 16 рд╡рд░реНрдгреЛрдВ рдХреЗ рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА (рдЗрд╕ рддрд░рд╣, рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЕрдиреБрдорд╛рдирд┐рдд рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдЗрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг 16-рд╡рд░реНрдг рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдПрдХ рдПрдХрд▓ рдХрдиреЗрдХреНрдЯ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреА рдкреАрдврд╝реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдЧрд╛ред )ред ValueStringBuilder рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░реА рдмрд╛рддрдЪреАрдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ: рдХреНрд╖рдорддрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╛рд╣рд░ рд╕реЗ рдореЗрдореЛрд░реА рд▓реЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдлрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдкреВрд░реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдвреЗрд░ рдкрд░ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрди рдирд╣реАрдВ? рдвреЗрд░ рдкрд░ рдкреНрд░рджрд░реНрд╢рди sagging рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рддреБрдо рдореБрдЭреЗ рдмрддрд╛рдУ: рдХреНрдпреЛрдВ рдирд╣реАрдВ ValueStringBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдпрд╛ рдЗрд╕рдХрд╛ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рд╕рдВрд╕реНрдХрд░рдг: рдХреНрдпрд╛ рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реБрд▓рдн рдирд╣реАрдВ рд╣реИ) рд╣рдореЗрд╢рд╛? рдЬрд╡рд╛рдм рд╣реИ: рдЖрдкрдХреЛ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╣рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдкрд░рд┐рдгрд╛рдореА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреНрдЮрд╛рдд рдЖрдХрд╛рд░ рдХреА рд╣реЛрдЧреА? рдХреНрдпрд╛ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЬреНрдЮрд╛рдд рдЕрдзрд┐рдХрддрдо рд╣реЛрдЧрд╛? рдпрджрд┐ рдЙрддреНрддрд░ рд╣рд╛рдВ рд╣реИ рдФрд░ рдЕрдЧрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрдХрд╛рд░ рдХреБрдЫ рдЙрдЪрд┐рдд рд╕реАрдорд╛рдУрдВ рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕реНрдЯреНрд░рд┐рдВрдЧрдмрд░реНрд╕реНрдЯреЛрди рдХреЗ рдПрдХ рд╕рд╛рд░реНрдердХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдпрджрд┐ рд╣рдо рд▓рдВрдмреА рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдпрдорд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВред


ValueListBuilder


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


рд╕рд╣рдордд: рдХрд╛рд░реНрдп ValueStringBuilder рдХрд╛рд░реНрдп рдХреЗ рд╕рдорд╛рди рд╣реИред рд╣рд╛рдВ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:


рдлрд╝рд╛рдЗрд▓ ValueListBuilder.cs


рдЗрд╕реЗ рдХреБрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░реЗрдВ: рд╣рдордиреЗ рдПрдХ List рдмрдирд╛рдИ, рдЗрд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдФрд░ рд▓рд┐рдВрдХ рдЦреЛ рджрд┐рдпрд╛ред рдпрджрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдЕрдХреНрд╕рд░ рдкрд░реНрдпрд╛рдкреНрдд рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рджреБрдЦрдж рд╕реНрдерд┐рддрд┐ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИ: List рд╡рд░реНрдЧ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдвреЗрд░ рдкрд░ рд▓рдЯрдХрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реБрдП рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдвреЗрд░ рдкрд░ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВред рдЕрдм рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ: рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, ValueStringBuilder рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ Microsoft рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ internal рд╕рдВрд╢реЛрдзрдХ рд╣реИред


рдЙрдкрдпреЛрдЧ рдХреА рд╢рд░реНрддреЗрдВ рдФрд░ рдирд┐рдпрдо


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


  • рдпрджрд┐ рдЖрдкрдХреА рд╡рд┐рдзрд┐ рдХреБрдЫ рдЖрд╡рдХ рдбреЗрдЯрд╛ рдХреЛ рдЙрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧреА, рддреЛ рдЖрдк Span рдкреНрд░рдХрд╛рд░ рдкрд░ рд░реЛрдХрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЗрд╕ рдмрдлрд╝рд░ рдХрд╛ рдХреЛрдИ рд╕рдВрд╢реЛрдзрди рдирд╣реАрдВ рд╣реИ, рддреЛ ReadOnlySpan рдкреНрд░рдХрд╛рд░ рдкрд░;
  • рдпрджрд┐ рдЖрдкрдХрд╛ рддрд░реАрдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХреБрдЫ рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧрд╛, рддреЛ рдЖрдкрдХреА рд╡рд┐рдзрд┐ ReadOnlySpan<char> рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред рдпрд╣ рдмрд╛рдзреНрдп рд╣реИ: рдпрд╣ рдПрдХ рдирдпрд╛ рдирд┐рдпрдо рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд┐рд╕реА рдХреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВ
  • рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рдо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ (рдЬреИрд╕реЗ, 10Kb рдЕрдзрд┐рдХрддрдо) рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ Span<TType> buf = stackalloc TType[size] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, TType рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рд░реНрдердХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ stackalloc рдХреЗрд╡рд▓ рд╕рд╛рд░реНрдердХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ Memory рдпрд╛ рдХреНрд▓рд╛рд╕рд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред


рд╕реНрдкреИрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


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


Span.Fast.cs, .NET рдХреЛрд░ 2.0 рдлрд╝рд╛рдЗрд▓


 public readonly ref partial struct Span<T> { ///    .NET    internal readonly ByReference<T> _pointer; ///      private readonly int _length; // ... } 

рдлрд╝рд╛рдЗрд▓ ??? [Decompiled]


 public ref readonly struct Span<T> { private readonly System.Pinnable<T> _pinnable; private readonly IntPtr _byteOffset; private readonly int _length; // ... } 

рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдмрдбрд╝реЗ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ .NET рдХреЛрд░ 1. * рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ (.NET рдХреЛрд░ 2.0+ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд) рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдмрдлрд░ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ Span рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА рдкреНрд░рдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдХреЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЗрдирд╕рд╛рдЗрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: рддреАрди рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдкреНрд░рдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИред рджреВрд╕рд░рд╛ рдбреЗрдЯрд╛ рдмрдлрд╝рд░ рдХреА рд╢реБрд░реБрдЖрдд рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдСрдлрд╕реЗрдЯ рд╣реИ (рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдпрд╣ char рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдлрд░ рд╣реИ, рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдпрд╣ рд╕рд░рдгреА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдлрд░ рд╣реИ)ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рддреАрд╕рд░рд╛ рдлрд╝реАрд▓реНрдб рдЗрд╕ рдмрдлрд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд╕реНрдЯреИрдХ рдХрд┐рдП рдЧрдП рд╣реИрдВред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП Span рдиреМрдХрд░реА рд▓реЗрдВ:


рдлрд╝рд╛рдЗрд▓ coreclr :: src / System.PStreet.CoreLib / share / System / MemoryExtensions.Fast.cs


 public static ReadOnlySpan<char> AsSpan(this string text) { if (text == null) return default; return new ReadOnlySpan<char>(ref text.GetRawStringData(), text.Length); } 

рдЬрд╣рд╛рдБ string.GetRawStringData() рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


рдлрд╝реАрд▓реНрдб рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ coreclr :: src / System.PStreet.CoreLib / src / System / String.CoreCLI.cs


GetRawStringData рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ coreclr :: src / System.PStreet.CoreLib / рд╕рд╛рдЭрд╛ / рдкреНрд░рдгрд╛рд▓реА /ring.cs


 public sealed partial class String : IComparable, IEnumerable, IConvertible, IEnumerable<char>, IComparable<string>, IEquatable<string>, ICloneable { // // These fields map directly onto the fields in an EE StringObject. See object.h for the layout. // [NonSerialized] private int _stringLength; // For empty strings, this will be '\0' since // strings are both null-terminated and length prefixed [NonSerialized] private char _firstChar; internal ref char GetRawStringData() => ref _firstChar; } 

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


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


рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкреИрди [рдЯреА]


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


 unsafe void Main() { var x = GetSpan(); } public Span<byte> GetSpan() { Span<byte> reff = new byte[100]; return reff; } 

рддрдм рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ:


 unsafe void Main() { var x = GetSpan(); } public Span<byte> GetSpan() { Span<byte> reff = stackalloc byte[100]; return reff; } 

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


рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╕реЛрдЪрд╛ рдерд╛, рдЕрдиреБрдорд╛рдиреЛрдВ рдФрд░ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рднреА рд╕рдордЭрд╛ред рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдореИрдВрдиреЗ рд╡реНрдпрд░реНрде рдХреЗ рдХреЛрдЧреЛрдВ рдкрд░ рдереНрд░реЗрдб рд╕реНрдЯреИрдХ рдкрд░ рдЕрдзреНрдпрд╛рдп рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рдХреЗ рд╕реНрдерд╛рдиреАрдп рдкреИрд░рд╛рдореЗрдВрдЯреНрд╕ рдХреЛ рдПрдХ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛, рдЖрдк рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЦрддреНрдо рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ x [0.99] рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


, , , , : CS8352 Cannot use local 'reff' in this context because it may expose referenced variables outside of their declaration scope : , , , .



Span<T> , . , use cases .


рдкреВрд░реА рдХрд┐рддрд╛рдм рдХрд╛ рд▓рд┐рдВрдХ



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


All Articles