{"id":293870,"date":"2019-08-26T21:00:18","date_gmt":"2019-08-26T21:00:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=293870"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=293870","title":{"rendered":"Unsafe.AsSpan: Span&lt;T&gt; \u043a\u0430\u043a \u0437\u0430\u043c\u0435\u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c?"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/3f\/dh\/ia\/3fdhia5h25mpjbabeocnlygdd1c.png\"><\/p>\n<p>  <\/p>\n<p><code>C#<\/code> \u2014 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0433\u0438\u0431\u043a\u0438\u0439 \u044f\u0437\u044b\u043a. \u041d\u0430 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u044d\u043a\u044d\u043d\u0434 \u0438\u043b\u0438 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <code>C#<\/code> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0438 \u0441 \u043d\u0430\u0443\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432 \u044f\u0437\u044b\u043a\u0435. \u0425\u043e\u0442\u044f <code>netcore<\/code> \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0441\u0442\u043a\u0443 \u0434\u043d\u044f (\u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 <code>netstandard2.0<\/code> <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/update-on-net-core-3-0-and-net-framework-4-8\/\">\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e<\/a> \u0444\u0438\u0447 \u043a\u0430\u043a \u044f\u0437\u044b\u043a\u043e\u0432, \u0442\u0430\u043a \u0438 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430, \u043d\u0435 \u0431\u044d\u043a-\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 <code>netframework<\/code>), \u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0441 \u043b\u0435\u0433\u0430\u0441\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438.<br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e \u043e\u0434\u043d\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 (\u043d\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435?) \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 <code>Span&lt;T&gt;<\/code> \u0438 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>Span&lt;T&gt;<\/code> \u0432 <code>netframework<\/code> \u0438 <code>netcore<\/code> \u0438\u0437-\u0437\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 <code>clr<\/code>.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440 1<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0434\u0430 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0438 \u0432 \u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445.<br \/>  \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 (\u043d\u0430\u0434\u0443\u043c\u0430\u043d\u043d\u043e\u0439?) \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u2014 \u044d\u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435, proof-of-concept.<br \/>  \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u044d\u0442\u043e \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u0445 \u0438 \u0440\u0438\u0441\u043a.<\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440 2<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u042f \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0433\u0434\u0435-\u0442\u043e, \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e <strong>\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e<\/strong> \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442 \u043a\u043e\u043c\u0443-\u0442\u043e \u0432 \u043a\u043e\u043b\u0435\u043d\u043e.<br \/>  \u041e\u0431\u0445\u043e\u0434 \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0432 <code>C#<\/code> \u0432\u0440\u044f\u0434 \u043b\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0447\u0435\u043c\u0443-\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u043c\u0443.<br \/>  \u041f\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c, \u044f \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u043e \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0438\u043c\u0438.<\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<h1 id=\"a-zachem-mne-voobsche-spant\">\u0410 \u0437\u0430\u0447\u0435\u043c \u043c\u043d\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 <code>Span&lt;T&gt;<\/code>?<\/h1>\n<p>  <\/p>\n<p>\u0421\u043f\u044d\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 <code>unmanaged<\/code>-\u0442\u0438\u043f\u043e\u0432 \u0432 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435, \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043f\u044d\u043d\u043e\u0432 \u0432 <code>BCL<\/code> <code>netframework<\/code> \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>System.Memory<\/code>, <code>System.Buffers<\/code> \u0438 <code>System.Runtime.CompilerServices.Unsafe<\/code>.<br \/>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u044d\u043d\u043e\u0432 \u0432 \u043c\u043e\u0435\u043c \u043b\u0435\u0433\u0430\u0441\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u043d\u0430\u0448\u0435\u043b \u0438\u043c \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u043d\u0430\u043f\u043b\u0435\u0432\u0430\u0432 \u043d\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u043e\u0432.<br \/>  \u0427\u0442\u043e \u0436\u0435 \u044d\u0442\u043e \u0437\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435? \u0412 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u043c\u0438 \u0441 \u043d\u0430\u0443\u0447\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u042d\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 <code>T[]<\/code>, \u0433\u0434\u0435 <code>T<\/code> \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 <code>unmanaged<\/code> \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>Int32<\/code> (\u043e\u043d \u0436\u0435 <code>int<\/code>). \u0414\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u0434\u0438\u0441\u043a, \u043c\u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u0439 <a href=\"https:\/\/en.wikipedia.org\/wiki\/FITS\">\u043b\u0435\u0433\u0430\u0441\u0438-\u0444\u043e\u0440\u043c\u0430\u0442<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d \u0432 <a href=\"http:\/\/adsabs.harvard.edu\/abs\/1981A&amp;AS...44..363W\">1981-\u043c<\/a>, \u0438 \u0441 \u0442\u0435\u0445 \u043f\u043e\u0440 \u0441\u043b\u0430\u0431\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f. \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u044d\u0442\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u2014 \u043e\u043d <a href=\"https:\/\/en.wikipedia.org\/wiki\/Endianess\">BigEndian<\/a>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c (\u0438\u043b\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c) \u043d\u0435\u0441\u0436\u0430\u0442\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 <code>T[]<\/code>, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c endianess \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0422\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430.<br \/>  \u041a\u0430\u043a\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f?<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0418\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 <code>T[]<\/code>, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>BitConverter.GetBytes(T)<\/code>, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u044d\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0439\u0442, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432.<\/li>\n<li>\u0418\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 <code>T[]<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043c\u0430\u0445\u0438\u043d\u0430\u0446\u0438\u0438 \u0432\u0438\u0434\u0430 <code>new byte[] {(byte)((x &amp; 0xFF00) &gt;&gt; 8), (byte)(x &amp; 0x00FF)};<\/code> (\u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0434\u0432\u0443\u0445\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u0430\u0445), \u043f\u0438\u0448\u0435\u043c \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432.<\/li>\n<li><sup>*<\/sup> \u041d\u043e \u0432\u0435\u0434\u044c <code>T[]<\/code> \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432? \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u043e\u0434\u0440\u044f\u0434, \u0434\u0430? \u0417\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0439\u0442\u0438 \u0432\u043e \u0432\u0441\u0435 \u0442\u044f\u0436\u043a\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>Buffer.BlockCopy(intArray, 0, byteArray, 0, intArray.Length * sizeof(int));<\/code>. \u041c\u0435\u0442\u043e\u0434 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u0438\u043f\u043e\u0432. \u041d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043d\u0435 \u043f\u0440\u043e\u043c\u0430\u0445\u043d\u0443\u0442\u044c\u0441\u044f \u0441 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0438 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0435\u0439. \u041f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0431\u0430\u0439\u0442\u044b \u0443\u0436\u0435 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435.<\/li>\n<li><sup>*<\/sup> \u0413\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e <code>C#<\/code> \u044d\u0442\u043e <a href=\"https:\/\/www.computerworld.com.au\/article\/261958\/a-z_programming_languages_c_\/?pp=2\"><code>(C++)++<\/code><\/a>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c <code>\/unsafe<\/code>, \u0432\u043e\u043e\u0440\u0443\u0436\u0430\u0435\u043c\u0441\u044f <code>fixed(int* p = &amp;intArr[0]) byte* bPtr = (byte*)p;<\/code> \u0438 \u0432\u043e\u0442 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0433\u0430\u0442\u044c \u043f\u043e \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043d\u0430 \u043b\u0435\u0442\u0443 \u043c\u0435\u043d\u044f\u0442\u044c endianess \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u043d\u0430 \u0434\u0438\u0441\u043a (\u0434\u043e\u0431\u0430\u0432\u0438\u0432 <code>stackalloc byte[]<\/code> \u0438\u043b\u0438 <code>ArrayPool&lt;byte&gt;.Shared<\/code> \u0434\u043b\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430), \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u0446\u0435\u043b\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, <strong>4<\/strong> \u043f\u0443\u043d\u043a\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043d\u043e \u044f\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>unsafe<\/code>-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u2014 \u044d\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u043e. \u0422\u0443\u0442 \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 <code>Span&lt;T&gt;<\/code>.<\/p>\n<p>  <\/p>\n<h1 id=\"spant\"><code>Span&lt;T&gt;<\/code><\/h1>\n<p>  <\/p>\n<p><code>Span&lt;T&gt;<\/code> \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0443\u0447\u0430\u0441\u0442\u043a\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c &#171;\u0437\u0430\u043a\u0440\u0435\u043f\u043b\u044f\u0442\u044c&#187; \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0422\u0430\u043a\u043e\u0439 <code>GC<\/code>-aware \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0412\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e.<br \/>  \u041e\u0434\u043d\u043e \u043b\u0438\u0448\u044c \u043d\u043e \u2014 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0431\u043e\u0433\u0430\u0442\u0441\u0442\u0432\u043e <code>System.Runtime.CompilerServices.Unsafe<\/code>, <code>Span&lt;T&gt;<\/code> \u0433\u0432\u043e\u0437\u0434\u044f\u043c\u0438 \u043f\u0440\u0438\u0431\u0438\u0442 \u043a \u0442\u0438\u043f\u0443 <code>T<\/code>. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u0441\u043f\u044d\u043d \u044d\u0442\u043e, \u043f\u043e \u0441\u0443\u0442\u0438, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c<sup>1<\/sup> + \u0434\u043b\u0438\u043d\u0430, \u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u0430\u0448 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0442\u0438\u043f\u0443, \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u044d\u043d? \u0411\u043b\u0430\u0433\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <code>public Span&lt;T&gt;(void* pointer, int length)<\/code>.<br \/>  \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0435\u0441\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">[Test] public void Test() {     void Flip(Span&lt;byte&gt; span) {\/* \u0442\u0443\u0442 \u0432\u0440\u0430\u0449\u0430\u0435\u043c endianess *\/}     Span&lt;int&gt; x = new [] {123};     Span&lt;byte&gt; y = DangerousCast&lt;int, byte&gt;(x);      Assert.AreEqual(123, x[0]);     Flip(y);     Assert.AreNotEqual(123, x[0]);     Flip(y);     Assert.AreEqual(123, x[0]); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0447\u0435\u043c \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0442\u0430\u043a. \u041f\u0440\u043e\u0432\u0430\u043b\u0438\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u0441\u0442? \u041e\u0442\u0432\u0435\u0442, \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u044b\u0432\u0430\u0435\u0442, \u2014 <strong>\u0437\u0430\u0432\u0438\u0441\u0438\u0442<\/strong>.<br \/>  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0442 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430. \u041d\u0430 <code>netcore<\/code> \u0442\u0435\u0441\u0442 <em>\u0434\u043e\u043b\u0436\u0435\u043d<\/em> \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0430 \u043d\u0430 <code>netframework<\/code> \u2014 \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f.<br \/>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u044d\u0441\u0441\u0435\u0440\u0442\u043e\u0432, \u0442\u0435\u0441\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 100% \u0441\u043b\u0443\u0447\u0430\u0435\u0432.<br \/>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  <\/p>\n<p><sup>1<\/sup> \u042f <em>\u043e\u0448\u0438\u0431\u0430\u043b\u0441\u044f<\/em>.<\/p>\n<p>  <\/p>\n<h1 id=\"pravilnyy-otvet-zavisit\">\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442: \u0437\u0430\u0432\u0438\u0441\u0438\u0442<\/h1>\n<p>  <\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 <em>\u0437\u0430\u0432\u0438\u0441\u0438\u0442<\/em>?<br \/>  \u0423\u0431\u0435\u0440\u0435\u043c \u0432\u0441\u0435 \u043b\u0438\u0448\u043d\u0435\u0435 \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">private static void Main() =&gt; Check();  private static void Check() {     Span&lt;int&gt;  x = new[] {999, 123, 11, -100};     Span&lt;byte&gt; y = As&lt;int, byte&gt;(ref x);      Console.WriteLine(@\"FRAMEWORK_NAME\");     Write(ref x);     Write(ref y);     Console.WriteLine();      Write&lt;int, int&gt;(ref x, \"Span&lt;int&gt; [0]\");     Write&lt;byte, int&gt;(ref y, \"Span&lt;byte&gt;[0]\");     Console.WriteLine();      Write&lt;int, int&gt;(ref Offset&lt;int, object&gt;(ref x[0], 1), \"Span&lt;int&gt; [0] offset by size_t\");     Write&lt;byte, int&gt;(ref Offset&lt;byte, object&gt;(ref y[0], 1), \"Span&lt;byte&gt;[0] offset by size_t\");     Console.WriteLine();      GC.Collect(0, GCCollectionMode.Forced, true, true);      Write&lt;int, int&gt;(ref x, \"Span&lt;int&gt; [0] after GC\");     Write&lt;byte, int&gt;(ref y, \"Span&lt;byte&gt;[0] after GC\");     Console.WriteLine();     Write(ref x);     Write(ref y); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>Write&lt;T, U&gt;<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043f\u044d\u043d \u0442\u0438\u043f\u0430 <code>T<\/code>, \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0442\u0438\u043f\u0430 <code>U<\/code>. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, <code>Write&lt;int, int&gt;(ref x)<\/code> \u0432\u044b\u0432\u0435\u0434\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 + \u0447\u0438\u0441\u043b\u043e 999.<br \/>  \u041e\u0431\u044b\u0447\u043d\u044b\u0439 <code>Write<\/code> \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e \u043c\u0435\u0442\u043e\u0434 <code>As&lt;,&gt;<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\"> private static unsafe Span&lt;U&gt; As&lt;T, U&gt;(ref Span&lt;T&gt; span)             where T : unmanaged             where U : unmanaged         {             fixed(T* ptr = span)                 return new Span&lt;U&gt;(ptr,                 span.Length * Unsafe.SizeOf&lt;T&gt;() \/ Unsafe.SizeOf&lt;U&gt;());         }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <code>C#<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c <code>fixed<\/code>-\u0441\u0442\u044d\u0439\u0442\u043c\u0435\u043d\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u044f\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <code>Span&lt;T&gt;.GetPinnableReference()<\/code>.<br \/>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430 <code>netframework4.8<\/code> \u0432 <code>x64<\/code> \u0440\u0435\u0436\u0438\u043c\u0435. \u0421\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">LEGACY [ 999, 123, 11, -100 ] [ 231, 3, 0, 0, 123, 0, 0, 0, 11, 0, 0, 0, 156, 255, 255, 255 ]  0x|00|00|02|8C|00|00|2F|B0         999  Span&lt;int&gt; [0] 0x|00|00|02|8C|00|00|2F|B0         999  Span&lt;byte&gt;[0]  0x|00|00|02|8C|00|00|2F|B8          11  Span&lt;int&gt; [0] offset by size_t 0x|00|00|02|8C|00|00|2F|B8          11  Span&lt;byte&gt;[0] offset by size_t  0x|00|00|02|8C|00|00|2B|18         999  Span&lt;int&gt; [0] after GC 0x|00|00|02|8C|00|00|2F|B0     6750318  Span&lt;byte&gt;[0] after GC  [ 999, 123, 11, -100 ] [ 110, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u0430 \u0441\u043f\u044d\u043d\u0430 (\u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0439 \u0442\u0438\u043f) \u0432\u0435\u0434\u0443\u0442 \u0441\u0435\u0431\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e, \u0430 <code>Span&lt;byte&gt;<\/code>, \u043f\u043e \u0441\u0443\u0442\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 byte-view \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0422\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e.<br \/>  \u041e\u043a\u0435\u0439, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u043f\u044d\u043d\u0430 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e <code>IntPtr<\/code> (\u0438\u043b\u0438 <code>2 X int<\/code> \u043d\u0430 <code>x64<\/code>) \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0440\u0435\u0442\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441. \u0410 \u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u043c\u0443\u0441\u043e\u0440&#8230;<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">GC.Collect(0, GCCollectionMode.Forced, true, true);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0444\u043b\u0430\u0433 \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043f\u0440\u043e\u0441\u0438\u0442 <code>GC<\/code> \u0443\u043f\u043b\u043e\u0442\u043d\u0438\u0442\u044c \u043a\u0443\u0447\u0443. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>GC.Collect<\/code> <code>GC<\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. <code>Span&lt;int&gt;<\/code> \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u044d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0430 \u0432\u043e\u0442 \u043d\u0430\u0448 <code>Span&lt;byte&gt;<\/code> \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u0433\u0434\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e. \u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432\u0441\u0435 \u043a\u043e\u043b\u0435\u043d\u0438 \u0441\u0440\u0430\u0437\u0443!<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u0434\u0430, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 <code>netcore3.0.100-preview8<\/code>. <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">CORE [ 999, 123, 11, -100 ] [ 231, 3, 0, 0, 123, 0, 0, 0, 11, 0, 0, 0, 156, 255, 255, 255 ]  0x|00|00|01|F2|8F|BD|C6|90         999  Span&lt;int&gt; [0] 0x|00|00|01|F2|8F|BD|C6|90         999  Span&lt;byte&gt;[0]  0x|00|00|01|F2|8F|BD|C6|98          11  Span&lt;int&gt; [0] offset by size_t 0x|00|00|01|F2|8F|BD|C6|98          11  Span&lt;byte&gt;[0] offset by size_t  0x|00|00|01|F2|8F|BD|BF|38         999  Span&lt;int&gt; [0] after GC 0x|00|00|01|F2|8F|BD|BF|38         999  Span&lt;byte&gt;[0] after GC  [ 999, 123, 11, -100 ] [ 231, 3, 0, 0, 123, 0, 0, 0, 11, 0, 0, 0, 156, 255, 255, 255 ]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <em>\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e<\/em>, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u0441\u043c\u043e\u0433 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f. \u041f\u043e\u0441\u043b\u0435 \u0443\u043f\u043b\u043e\u0442\u043d\u0435\u043d\u0438\u044f, \u043e\u0431\u0430 \u0441\u043f\u044d\u043d\u0430 \u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u0432\u043e\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. \u041e\u0442\u043b\u0438\u0447\u043d\u043e! \u041d\u043e \u043a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u043b\u0435\u0433\u0430\u0441\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0435?<\/p>\n<p>  <\/p>\n<h1 id=\"jit-intrinsic\">JIT intrinsic<\/h1>\n<p>  <\/p>\n<p>\u042f \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0437\u0430\u0431\u044b\u043b, \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043f\u044d\u043d\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 <code>netcore<\/code> \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/dotnet\/corefx\/blob\/53edc76f126940875d6ea11ede1f6a00e4a4ce5b\/src\/Common\/src\/CoreLib\/System\/ByReference.cs#L23\">\u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a<\/a>. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, <code>netcore<\/code> \u0443\u043c\u0435\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u0430\u0436\u0435 \u043d\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 <code>GC<\/code> \u0435\u0433\u043e \u0448\u0435\u0432\u0435\u043b\u0438\u0442. \u0412 <code>netframework<\/code> \u0436\u0435 <code>nuget<\/code>-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u044d\u043d\u0430 \u2014 \u044d\u0442\u043e \u043a\u043e\u0441\u0442\u044b\u043b\u044c. \u041f\u043e \u0441\u0443\u0442\u0438, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043f\u044d\u043d\u0430: \u043e\u0434\u0438\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u0441\u0441\u044b\u043b\u043a\u0438, \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442, \u043d\u0430 \u0447\u0442\u043e \u043e\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442. \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0441\u043f\u044d\u043d-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430, \u043a\u0443\u0434\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u0414\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u044d\u0442\u043e <em>\u043f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f<\/em> \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u044d\u043d\u0430 \u0432 <code>netcore<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">readonly ref struct Span&lt;T&gt; where T : unmanaged {     private readonly ByReference&lt;T&gt; _pointer; \/\/ \u0412\u043d\u0443\u0442\u0440\u0438 - \u043c\u0430\u0433\u0438\u044f \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430     private readonly int _length; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0438 \u0432 <code>netframework<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">readonly ref struct Span&lt;T&gt; where T : unmanaged {     private readonly Pinnable&lt;T&gt; _pinnable;     private readonly IntPtr _byteOffset;     private readonly int _length; }<\/code><\/pre>\n<p>  <\/p>\n<p><code>_pinnable<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0439 \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, <code>_byteOffset<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0434\u0432\u0438\u0433 (\u0434\u0430\u0436\u0435 \u0441\u043f\u044d\u043d \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043a\u0438\u0439 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0441\u0434\u0432\u0438\u0433, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, <em>\u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435<\/em>). \u0415\u0441\u043b\u0438 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c <code>void*<\/code>, \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0432 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 <code>_byteOffset<\/code>. \u0421\u043f\u044d\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0431\u0438\u0442 \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u043a \u0443\u0447\u0430\u0441\u0442\u043a\u0443 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0437\u043e\u0431\u0438\u043b\u0443\u044e\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438 \u0442\u0438\u043f\u0430 <code>if(_pinnable is null) {\/* \u0432\u0435\u0440\u043d\u0438 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e *\/} else {\/* \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0439 \u0441\u0434\u0432\u0438\u0433 \u043e\u0442 _pinnable *\/}<\/code>. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438?<\/p>\n<p>  <\/p>\n<h1 id=\"kak-delat-ne-stoit-no-ya-vse-zhe-sdelal\">\u041a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442, \u043d\u043e \u044f \u0432\u0441\u0435 \u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b<\/h1>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u043c <code>netframework<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u043a\u0430\u0441\u0442 <code>Span&lt;T&gt; -&gt; Span&lt;U&gt;<\/code>, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438.<br \/>  <strong>\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e: \u044d\u0442\u043e \u0437\u043e\u043d\u0430 \u043d\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0438 Undefined Behavior \u0432 \u043a\u043e\u043d\u0446\u0435<\/strong><\/p>\n<p>  <\/p>\n<h2 id=\"metod-1-naivnyy\">\u041c\u0435\u0442\u043e\u0434 1: \u041d\u0430\u0438\u0432\u043d\u044b\u0439<\/h2>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0435 \u0434\u0430\u0441\u0442 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0430 <code>netframework<\/code>. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>_pinnable<\/code>. \u041e\u043a\u0435\u0439, \u0440\u0430\u0441\u0447\u0435\u0445\u043b\u0438\u043c \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e, \u0432\u044b\u0442\u0430\u0449\u0438\u043c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f (\u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e \u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e), \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432 \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u044d\u043d, \u043f\u043e\u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f. \u0415\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 <em>\u043c\u0430-\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f<\/em> \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0441\u043f\u044d\u043d \u044d\u0442\u043e <code>ref struct<\/code>, \u043e\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0430, \u043d\u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432 <code>object<\/code>. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442, \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u0437\u0430\u043f\u0438\u0445\u0430\u0442\u044c \u0441\u043f\u044d\u043d \u0432 \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0439 \u0442\u0438\u043f. \u041f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 (\u0435\u0449\u0435 \u0438 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e \u043f\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u044f\u043c) \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b.<\/p>\n<p>  <\/p>\n<h2 id=\"metod-2-we-need-to-go-deeper\">\u041c\u0435\u0442\u043e\u0434 2: We need to go deeper<\/h2>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043e \u043c\u0435\u043d\u044f (<a href=\"https:\/\/habr.com\/en\/post\/423657\/\">[1]<\/a>, <a href=\"https:\/\/habr.com\/en\/post\/358872\/\">[2]<\/a>, <a href=\"https:\/\/www.youtube.com\/watch?v=hGxXt4AyWnU\">[3]<\/a>). \u0421\u043f\u044d\u043d \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 <code>T<\/code> \u0442\u0440\u0438 \u043f\u043e\u043b\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u043c\u044f\u0442\u0438 (<em>\u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435<\/em>). \u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 <code>[FieldOffset(0)]<\/code>? \u0421\u043a\u0430\u0437\u0430\u043d\u043e \u2014 \u0441\u0434\u0435\u043b\u0430\u043d\u043e.<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">[StructLayout(LayoutKind.Explicit)] ref struct Exchange&lt;T, U&gt;     where T : unmanaged     where U : unmanaged     {         [FieldOffset(0)]         public Span&lt;T&gt; Span_1;         [FieldOffset(0)]         public Span&lt;U&gt; Span_2;     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (\u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f) \u043d\u0430\u0441 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442 <code>TypeLoadException<\/code> \u2014 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>LayoutKind.Explicit<\/code>. \u041e\u043a\u0435\u0439, \u043d\u0435 \u0431\u0435\u0434\u0430, \u043f\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u043c\u0443 \u043f\u0443\u0442\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">[StructLayout(LayoutKind.Explicit)] public ref struct Exchange {     [FieldOffset(0)]     public Span&lt;byte&gt; ByteSpan;     [FieldOffset(0)]     public Span&lt;sbyte&gt; SByteSpan;     [FieldOffset(0)]     public Span&lt;ushort&gt; UShortSpan;     [FieldOffset(0)]     public Span&lt;short&gt; ShortSpan;     [FieldOffset(0)]     public Span&lt;uint&gt; UIntSpan;     [FieldOffset(0)]     public Span&lt;int&gt;  IntSpan;     [FieldOffset(0)]     public Span&lt;ulong&gt; ULongSpan;     [FieldOffset(0)]     public Span&lt;long&gt; LongSpan;     [FieldOffset(0)]     public Span&lt;float&gt; FloatSpan;     [FieldOffset(0)]     public Span&lt;double&gt; DoubleSpan;     [FieldOffset(0)]     public Span&lt;char&gt; CharSpan; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">private static Span&lt;byte&gt; As2(Span&lt;int&gt; span) {     var exchange = new Exchange()     {         IntSpan = span     };     return exchange.ByteSpan; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043e\u0434\u043d\u043e\u0439 \u043b\u0438\u0448\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u2014 \u043f\u043e\u043b\u0435 <code>_length<\/code> \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u043a\u0430\u0441\u0442\u0435 <code>int<\/code> -&gt; <code>byte<\/code> \u0434\u043b\u0438\u043d\u0430 \u0431\u0430\u0439\u0442-\u0441\u043f\u044d\u043d\u0430 \u0432 4 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430.<br \/>  \u041d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">[StructLayout(LayoutKind.Sequential)] public ref struct Raw {     public object Pinnable;     public IntPtr Pointer;     public int Length; } [StructLayout(LayoutKind.Explicit)] public ref struct Exchange {     \/* *\/     [FieldOffset(0)]     public Raw RawView; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0447\u0435\u0440\u0435\u0437 <code>RawView<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044e \u0441\u043f\u044d\u043d\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">private static Span&lt;byte&gt; As2(Span&lt;int&gt; span) {     var exchange = new Exchange()     {         IntSpan = span     };      var exchange2 = new Exchange()     {         RawView = new Raw()         {             Pinnable = exchange.RawView.Pinnable,             Pointer = exchange.RawView.Pointer,             Length = exchange.RawView.Length * sizeof&lt;int&gt; \/ sizeof&lt;byte&gt;         }     };      return exchange2.ByteSpan; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <strong>\u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0430\u0434\u043e<\/strong>, \u0435\u0441\u043b\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0433\u0440\u044f\u0437\u043d\u044b\u0445 \u0442\u0440\u044e\u043a\u043e\u0432. \u041c\u0438\u043d\u0443\u0441 \u2014 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a \u0432\u0435\u0440\u0441\u0438\u044e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"metod-3-bezumnyy\">\u041c\u0435\u0442\u043e\u0434 3: \u0411\u0435\u0437\u0443\u043c\u043d\u044b\u0439<\/h2>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442, \u044f \u043b\u044e\u0431\u043b\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0449\u0438. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u043f\u0430\u0440\u044b <code>unmanaged<\/code> \u0442\u0438\u043f\u043e\u0432 \u043c\u0435\u043d\u044f \u043d\u0435 \u0440\u0430\u0434\u043e\u0432\u0430\u043b\u0430. \u041a\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>CLR<\/code> \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 <em>\u0437\u0430 \u0432\u0430\u0441<\/em>.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f? \u0415\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u0435\u0441\u0442\u044c <a href=\"https:\/\/habr.com\/en\/post\/358872\/\">\u0441\u0442\u0430\u0442\u044c\u0438<\/a>. \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u0438\u043b\u0434\u0435\u0440 \u0441\u0431\u043e\u0440\u043a\u0438 -&gt; \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u0438\u043b\u0434\u0435\u0440 \u043c\u043e\u0434\u0443\u043b\u044f -&gt; \u0441\u0442\u0440\u043e\u0438\u043c \u0442\u0438\u043f -&gt; {\u041f\u043e\u043b\u044f, \u041c\u0435\u0442\u043e\u0434\u044b, \u0438 \u0442.\u0434.} -&gt; \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0442\u0438\u043f\u0430 <code>Type<\/code>.<br \/>  \u0427\u0442\u043e\u0431\u044b \u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0438\u043f (\u0432\u0435\u0434\u044c \u044d\u0442\u043e <code>ref struct<\/code>), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043b\u044e\u0431\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0442\u0438\u043f\u0430 <code>ildasm<\/code>. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u044b\u043b <strong>dotPeek<\/strong>.<br \/>  \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 type builder \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">var typeBuilder = _mBuilder.DefineType($\"Generated_{typeof(T).Name}\",                 TypeAttributes.Public                 | TypeAttributes.Sealed                 | TypeAttributes.ExplicitLayout   \/\/ &lt;- \u0412\u043e\u0442 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e                 | TypeAttributes.AnsiClass                 | TypeAttributes.BeforeFieldInit, typeof(ValueType));<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u2014 \u043f\u043e\u043b\u044f. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>Span&lt;T&gt;<\/code> \u0432 <code>Span&lt;U&gt;<\/code> \u0438\u0437-\u0437\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0434\u043b\u0438\u043d \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0432\u0438\u0434\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">[StructLayout(LayoutKind.Explicit)] ref struct Generated_Int32 {     [FieldOffset(0)]     public Span&lt;Int32&gt; Span;     [FieldOffset(0)]     public Raw Raw; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c <code>Raw<\/code> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438 \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e <code>IsByRefLikeAttribute<\/code>. \u0421 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">var spanField = typeBuilder.DefineField(\"Span\", typeof(Span&lt;T&gt;), FieldAttributes.Private); spanField.SetOffset(0); var rawField = typeBuilder.DefineField(\"Raw\", typeof(Raw), FieldAttributes.Private); rawField.SetOffset(0);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435, \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0442\u0438\u043f \u0433\u043e\u0442\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443, \u043c\u043e\u0434\u0443\u043b\u044c. \u041a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c (<code>T -&gt; Generated_{nameof(T)}<\/code>). \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u0435\u0440\u0442\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0434\u0432\u0443\u043c \u0442\u0438\u043f\u0430\u043c <code>TIn<\/code> \u0438 <code>TOut<\/code> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430-\u0445\u044d\u043b\u043f\u0435\u0440\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0441\u043f\u044d\u043d\u0430\u043c\u0438. \u0415\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u043d\u043e. \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u043d\u0430 \u0441\u043f\u044d\u043d\u0430\u0445 (\u0438\u043b\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 <code>ref struct<\/code>) \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. <em>\u041b\u0438\u0431\u043e \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/em>. \u041a\u0430\u043a \u0436\u0435 \u0431\u044b\u0442\u044c?<\/p>\n<p>  <\/p>\n<h2 id=\"delegates-to-the-rescue\">Delegates to the rescue<\/h2>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\"> object Invoke(this MethodInfo mi, object @this, object[] otherArgs)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043d\u0438 \u043d\u0435 \u043d\u0435\u0441\u0443\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0438\u043f\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0431\u043e\u043a\u0441\u0438\u043d\u0433 (= \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0430) \u0434\u043b\u044f \u0432\u0430\u0441 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b \u2014 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435\u0442.<br \/>  \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, <code>@this<\/code> \u0438 <code>otherArgs<\/code> \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 <code>ref struct<\/code>, \u0447\u0442\u043e \u043c\u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.<br \/>  \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0449\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0447\u0442\u043e \u0443 \u0442\u0438\u043f\u0430 \u0435\u0441\u0442\u044c \u0433\u0435\u0442\u0442\u0435\u0440 \u0438 \u0441\u0435\u0442\u0442\u0435\u0440 \u043c\u0435\u0442\u043e\u0434\u044b (\u043d\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b).<br \/>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">void Generated_Int32.SetSpan(Span&lt;Int32&gt; span) =&gt; this.Span = span;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u043c\u0435\u0442\u043e\u0434\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0442\u0438\u043f \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430 (\u044f\u0432\u043d\u043e \u0432 \u043a\u043e\u0434\u0435):<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">delegate void SpanSetterDelegate&lt;T&gt;(Span&lt;T&gt; span) where T : unmanaged;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u0442\u0430\u043a\u043e\u0435 \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0434\u0442\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u044d\u043a\u0448\u0435\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 <code>Action&lt;Span&lt;T&gt;&gt;<\/code>, \u043d\u043e \u0441\u043f\u044d\u043d\u044b \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. <code>SpanSetterDelegate<\/code>, \u043e\u0434\u043d\u0430\u043a\u043e, \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u0434\u0435\u043b\u0435\u0433\u0430\u0442.<br \/>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0435\u0431\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">var mi = type.GetMethod(\"Method_Name\"); \/\/ \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f, \u0447\u0442\u043e \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434 public &amp; instance var spanSetter =  (SpanSetterDelegate&lt;T&gt;) mi.CreateDelegate(typeof(SpanSetterDelegate&lt;T&gt;), @this); <\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c <code>spanSetter<\/code> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>spanSetter(Span&lt;T&gt;.Empty);<\/code>. \u0427\u0442\u043e \u0434\u043e <code>@this<\/code><sup>2<\/sup>, \u0442\u043e \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0447\u0435\u0440\u0435\u0437 <code>Activator.CreateInstance(type)<\/code>, \u0432\u0435\u0434\u044c \u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0435\u0441\u0442\u044c \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0443\u0431\u0435\u0436 \u2014 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b.<\/p>\n<p>  <\/p>\n<p><sup>2<\/sup> \u041c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u043e \u2014 <code>Activator.CreateInstance()<\/code> \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 <code>ref struct<\/code>-\u0438\u043d\u0441\u0442\u0430\u043d\u0441. \u0421\u043c. \u043a\u043e\u043d\u0435\u0446 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430.<\/p>\n<p>  <\/p>\n<h2 id=\"znakomtes-reflectionemit\">\u0417\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c, <code>Reflection.Emit<\/code><\/h2>\n<p>  <\/p>\n<p>\u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>Expression<\/code>, \u0442.\u043a. \u0442\u0435\u043b\u0430 \u043d\u0430\u0448\u0438\u0445 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0433\u0435\u0442\u0442\u0435\u0440\u043e\u0432\/\u0441\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u044b \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u042f \u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043b \u0434\u0440\u0443\u0433\u043e\u0439, \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 <strong>IL<\/strong>-\u043a\u043e\u0434 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0435\u0442\u0442\u0435\u0440\u0430, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 (<code>Debug<\/code>, <code>X86<\/code>, <code>netframework4.8<\/code>)<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">nop ldarg.0 ldfld \/* \u0447\u0442\u043e-\u0442\u043e *\/ stloc.0 br.s \/* \u0430\u0434\u0440\u0435\u0441 *\/ ldloc.0 ret<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043a\u0443\u0447\u0430 \u043c\u0435\u0441\u0442 \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438.<br \/>  \u0412 \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ldarg.0 ldfld \/* \u0447\u0442\u043e-\u0442\u043e *\/ ret<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0443\u043b\u0435\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441-\u043c\u0435\u0442\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f\u2026 <code>this<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 <strong>IL<\/strong> \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<br \/>  1) \u0417\u0430\u0433\u0440\u0443\u0437\u0438 <code>this<\/code><br \/>  2) \u0417\u0430\u0433\u0440\u0443\u0437\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f<br \/>  3) \u0412\u0435\u0440\u043d\u0438<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e, \u0434\u0430? \u0412 <code>Reflection.Emit<\/code> \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f, \u043a\u0440\u043e\u043c\u0435 \u043e\u043f-\u043a\u043e\u0434\u0430, \u0435\u0449\u0435 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440-\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043f\u043e\u043b\u044f. \u041a\u0430\u043a \u0440\u0430\u0437 \u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>spanField<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">var getSpan = type.DefineMethod(\"GetSpan\",                     MethodAttributes.Public                     | MethodAttributes.HideBySig,                     CallingConventions.Standard,                     typeof(Span&lt;T&gt;), Array.Empty&lt;Type&gt;());  gen = getSpan.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Ldfld, spanField); gen.Emit(OpCodes.Ret);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0441\u0435\u0442\u0442\u0435\u0440\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0430 \u0441\u0442\u044d\u043a <code>this<\/code>, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u043e\u043b\u0435 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">ldarg.0 ldarg.1 stfld \/* \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u044f *\/ ret<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0434\u0435\u043b\u0430\u0432 \u0442\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u044f <code>Raw<\/code>, \u043e\u0431\u044a\u044f\u0432\u0438\u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u044b (\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435), \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043f \u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430-\u0430\u043a\u0441\u0435\u0441\u0441\u043e\u0440\u0430, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a-\u0434\u0435\u043b\u0435\u0433\u0430\u0442\u044b.<\/p>\n<p>  <\/p>\n<p>\u041f\u0438\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0441-\u043e\u0431\u0435\u0440\u0442\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u0434\u0432\u0443\u043c \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c (<code>TIn<\/code>, <code>TOut<\/code>) \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u0442\u0438\u043f\u0430 <code>Type<\/code>, \u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 (\u0437\u0430\u043a\u044d\u0448\u0438\u0440\u0432\u043e\u0430\u043d\u043d\u044b\u0435) \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e, \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a-\u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e<\/p>\n<p>  <\/p>\n<ol>\n<li><code>void SetSpan(Span&lt;TIn&gt; span)<\/code> \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u043f\u044d\u043d \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443<\/li>\n<li><code>Raw GetRaw()<\/code> \u0447\u0442\u043e\u0431\u044b \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u043f\u044d\u043d\u0430 \u043a\u0430\u043a <code>Raw<\/code>-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443<\/li>\n<li><code>void SetRaw(Raw raw)<\/code> \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e <code>Raw<\/code> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442<\/li>\n<li><code>Span&lt;TOut&gt; GetSpan()<\/code> \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043f\u044d\u043d \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0441 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>@this<\/code>. <strong>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b. <code>Activator.CreateInstance<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>object<\/code>. \u041f\u043e \u0432\u0441\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u044d\u0442\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f <code>ref<\/code>-like (<\/strong><code>type.IsByRef<\/code><s>Like<\/s> <code>== false<\/code><strong>), \u043e\u0434\u043d\u0430\u043a\u043e <code>ref<\/code>-like \u043f\u043e\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u043e\u0441\u044c. \u0412\u0438\u0434\u0438\u043c\u043e, \u0442\u0430\u043a\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u044f\u0437\u044b\u043a\u0435, \u043d\u043e <code>CLR<\/code> \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0432\u0430\u0440\u0438\u0432\u0430\u0435\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0435\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043b\u0435\u043d\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/strong> <sup>3<\/sup><\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a \u0442\u0438\u043f\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430 \u0438 \u0434\u0432\u0435 \u043d\u0435\u044f\u0432\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u0414\u0435\u043b\u0435\u0433\u0430\u0442\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043a\u0430\u0441\u0442\u043e\u0432 \u043f\u043e\u0434\u0440\u044f\u0434. \u0414\u043b\u044f \u043f\u0443\u0449\u0435\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0441\u043d\u043e\u0432\u0430 \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u043c (\u0443\u0436\u0435 \u0442\u0438\u043f-\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440) \u043f\u043e \u043f\u0430\u0440\u0435 <code>(TIn, TOut) -&gt; Generator&lt;TIn, TOut&gt;<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"shtrih-posledniy-privodim-tipy-spantin---spantout\">\u0428\u0442\u0440\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439: \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0442\u0438\u043f\u044b, <code>Span&lt;TIn&gt; -&gt; Span&lt;TOut&gt;<\/code><\/h2>\n<p>  <\/p>\n<pre><code class=\"cs\">public Span&lt;TOut&gt; Cast(Span&lt;TIn&gt; span) {     \/\/ \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u0443\u0442\u044c \u0435\u0441\u043b\u0438 \u0441\u043f\u044d\u043d \u043f\u0443\u0441\u0442     if (span.IsEmpty)         return Span&lt;TOut&gt;.Empty;      \/\/ Caller \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u0435\u043d \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0441\u043f\u044d\u043d\u043e\u0432 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445     if (span.Length * Unsafe.SizeOf&lt;TIn&gt;() % Unsafe.SizeOf&lt;TOut&gt;() != 0)         throw new InvalidOperationException();      \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u043f\u044d\u043d \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     \/\/ Span&lt;TIn&gt; _input.Span = span;     _spanSetter(span);      \/\/ \u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c Raw     \/\/ Raw raw = _input.Raw;     var raw = _rawGetter();      var newRaw = new Raw()     {         Pinnable = raw.Pinnable, \/\/ \u0412\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0442 \u0436\u0435 Pinnable         Pointer = raw.Pointer, \/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u0441\u0434\u0432\u0438\u0433         Length = raw.Length * Unsafe.SizeOf&lt;TIn&gt;() \/ Unsafe.SizeOf&lt;TOut&gt;() \/\/ \u041d\u043e\u0432\u0430\u044f \u0434\u043b\u0438\u043d\u0430     };      \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 Raw \u0432\u043e \u0432\u0442\u043e\u0440\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     \/\/ Raw _output.Raw = newRaw;     _rawSetter(newRaw);      \/\/ \u0412\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0441\u043f\u044d\u043d \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430     \/\/ Span&lt;TOut&gt; _output.Span     return _spanGetter(); }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"vyvod\">\u0412\u044b\u0432\u043e\u0434<\/h1>\n<p>  <\/p>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u2014 \u0440\u0430\u0434\u0438 \u0441\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u2014 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u0445 \u0438 \u0440\u0438\u0441\u043a. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 <code>unsafe \/ fixed<\/code> \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043d\u0443\u0441\u043e\u043c. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c \u043c\u0438\u043d\u0443\u0441\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p>  <\/p>\n<h1 id=\"dlya-teh-kto-dochital-do-konca\">\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b \u0434\u043e \u043a\u043e\u043d\u0446\u0430.<\/h1>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0430\u0438\u0432\u043d\u043e\u0433\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u0410 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u0431\u044b\u0441\u0442\u0440\u043e?<br \/>  \u042f \u0441\u0440\u0430\u0432\u043d\u0438\u043b \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u0432 \u0432 \u0433\u043b\u0443\u043f\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435\/\u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u0441\u0442\u043e\u0432 \u0438 \u0441\u043f\u044d\u043d\u043e\u0432, \u043d\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<ol>\n<li><code>Cast_Explicit<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u044f\u0432\u043d\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0442\u0438\u043f, \u043a\u0430\u043a \u0432 <em>\u041c\u0435\u0442\u043e\u0434\u0435 2<\/em>. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0441\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0434\u0432\u0443\u0445 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u0432 \u043a \u043f\u043e\u043b\u044f\u043c;<\/li>\n<li><code>Cast_IL<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <em>\u041c\u0435\u0442\u043e\u0434 3<\/em>, \u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043d\u043e\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>Generator&lt;TIn, TOut&gt;<\/code>, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c \u043f\u043e\u0438\u0441\u043a\u0430\u043c \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u043c, \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0442\u0438\u043f\u044b;<\/li>\n<li><code>Cast_IL_Cached<\/code> \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430 <code>Generator&lt;TIn, TOut&gt;<\/code>, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0442.\u043a. \u0432\u0435\u0441\u044c \u043a\u0430\u0441\u0442 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0432\u044b\u0437\u043e\u0432\u0430\u043c \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432;<\/li>\n<li><code>Buffer<\/code> \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u043a\u043e\u043f\u0438\u0440\u0443\u044f \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442\u043e\u0432, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u043f\u044d\u0439\u043b\u043e\u0430\u0434. \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442\u043e\u0432 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u044d\u0439\u043b\u043e\u0430\u0434\u0430 \u2014 \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0441\u0443\u043c\u043c\u044b \u0431\u0430\u0439\u0442\u043e\u0432 \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0447\u0430\u0441\u0442\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>int[N]<\/code> \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 <code>N\/2<\/code> \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0418\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043f\u043b\u044f\u0441\u043a\u0438 \u0441\u043e \u0441\u043f\u044d\u043d\u0430\u043c\u0438. \u041a\u0430\u0441\u0442 \u0441\u043f\u044d\u043d\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430 \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u0441\u0442\u0430\u0435\u0442 \u043e\u0442 \u0436\u0430\u0434\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u044f \u0443 \u0434\u0432\u0443\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u043c. \u0412 \u043e\u0431\u0449\u0435\u043c \u0438 \u0446\u0435\u043b\u043e\u043c, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043a\u0430\u0441\u0442\u0430 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u043b\u0433\u0438\u043c \u0437\u0430 \u0441\u0447\u0435\u0442 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438, \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u0438 \u0432 \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043e\u0436\u043d\u043e <em>\u043f\u043e\u0447\u0442\u0438<\/em> <em>\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e<\/em> <em>\u043d\u0435\u043c\u043d\u043e\u0436\u0435\u0447\u043a\u043e \u043d\u0430\u0440\u0443\u0448\u0430\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0433\u0440\u044b<\/em> \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 <code>unmanaged<\/code> \u0442\u0438\u043f\u0430 \u0431\u0435\u0437 <em>\u044d\u0442\u0438\u0445 \u0432\u0430\u0448\u0438\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439<\/em>.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362 Intel Core i7-2700K CPU 3.50GHz (Sandy Bridge), 1 CPU, 8 logical and 4 physical cores   [Host] : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.8.3815.0   Clr    : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.8.3815.0  Job=Clr  Runtime=Clr  InvocationCount=1   UnrollFactor=1   <\/code><\/pre>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>Method<\/th>\n<th>N<\/th>\n<th>Mean<\/th>\n<th>Error<\/th>\n<th>StdDev<\/th>\n<th>Median<\/th>\n<th>Ratio<\/th>\n<th>RatioSD<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Cast_Explicit<\/strong><\/td>\n<td><strong>100<\/strong><\/td>\n<td><strong>362.2 ns<\/strong><\/td>\n<td><strong>18.0967 ns<\/strong><\/td>\n<td><strong>52.7888 ns<\/strong><\/td>\n<td><strong>400.0 ns<\/strong><\/td>\n<td><strong>1.00<\/strong><\/td>\n<td><strong>0.00<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Cast_IL<\/td>\n<td>100<\/td>\n<td>1,237.9 ns<\/td>\n<td>28.5954 ns<\/td>\n<td>67.4027 ns<\/td>\n<td>1,200.0 ns<\/td>\n<td>3.47<\/td>\n<td>0.51<\/td>\n<\/tr>\n<tr>\n<td>Cast_IL_Cached<\/td>\n<td>100<\/td>\n<td>522.8 ns<\/td>\n<td>25.2640 ns<\/td>\n<td>71.2576 ns<\/td>\n<td>500.0 ns<\/td>\n<td>1.46<\/td>\n<td>0.27<\/td>\n<\/tr>\n<tr>\n<td>Buffer<\/td>\n<td>100<\/td>\n<td>300.0 ns<\/td>\n<td>0.0000 ns<\/td>\n<td>0.0000 ns<\/td>\n<td>300.0 ns<\/td>\n<td>0.78<\/td>\n<td>0.11<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><strong>Cast_Explicit<\/strong><\/td>\n<td><strong>1000<\/strong><\/td>\n<td><strong>2,628.6 ns<\/strong><\/td>\n<td><strong>54.0688 ns<\/strong><\/td>\n<td><strong>64.3650 ns<\/strong><\/td>\n<td><strong>2,600.0 ns<\/strong><\/td>\n<td><strong>1.00<\/strong><\/td>\n<td><strong>0.00<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Cast_IL<\/td>\n<td>1000<\/td>\n<td>3,216.7 ns<\/td>\n<td>49.8568 ns<\/td>\n<td>38.9249 ns<\/td>\n<td>3,200.0 ns<\/td>\n<td>1.21<\/td>\n<td>0.03<\/td>\n<\/tr>\n<tr>\n<td>Cast_IL_Cached<\/td>\n<td>1000<\/td>\n<td>2,484.6 ns<\/td>\n<td>44.9717 ns<\/td>\n<td>37.5534 ns<\/td>\n<td>2,500.0 ns<\/td>\n<td>0.94<\/td>\n<td>0.02<\/td>\n<\/tr>\n<tr>\n<td>Buffer<\/td>\n<td>1000<\/td>\n<td>2,055.6 ns<\/td>\n<td>43.9695 ns<\/td>\n<td>73.4631 ns<\/td>\n<td>2,000.0 ns<\/td>\n<td>0.78<\/td>\n<td>0.03<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><strong>Cast_Explicit<\/strong><\/td>\n<td><strong>1000000<\/strong><\/td>\n<td><strong>2,515,157.1 ns<\/strong><\/td>\n<td><strong>11,809.8538 ns<\/strong><\/td>\n<td><strong>10,469.1278 ns<\/strong><\/td>\n<td><strong>2,516,050.0 ns<\/strong><\/td>\n<td><strong>1.00<\/strong><\/td>\n<td><strong>0.00<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Cast_IL<\/td>\n<td>1000000<\/td>\n<td>2,263,826.7 ns<\/td>\n<td>23,724.4930 ns<\/td>\n<td>22,191.9054 ns<\/td>\n<td>2,262,000.0 ns<\/td>\n<td>0.90<\/td>\n<td>0.01<\/td>\n<\/tr>\n<tr>\n<td>Cast_IL_Cached<\/td>\n<td>1000000<\/td>\n<td>2,265,186.7 ns<\/td>\n<td>19,505.5913 ns<\/td>\n<td>18,245.5422 ns<\/td>\n<td>2,266,300.0 ns<\/td>\n<td>0.90<\/td>\n<td>0.01<\/td>\n<\/tr>\n<tr>\n<td>Buffer<\/td>\n<td>1000000<\/td>\n<td>1,959,547.8 ns<\/td>\n<td>39,175.7435 ns<\/td>\n<td>49,544.7719 ns<\/td>\n<td>1,959,200.0 ns<\/td>\n<td>0.78<\/td>\n<td>0.02<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><strong>Cast_Explicit<\/strong><\/td>\n<td><strong>100000000<\/strong><\/td>\n<td><strong>255,751,392.9 ns<\/strong><\/td>\n<td><strong>2,595,107.7066 ns<\/strong><\/td>\n<td><strong>2,300,495.3873 ns<\/strong><\/td>\n<td><strong>255,298,950.0 ns<\/strong><\/td>\n<td><strong>1.00<\/strong><\/td>\n<td><strong>0.00<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Cast_IL<\/td>\n<td>100000000<\/td>\n<td>228,709,457.1 ns<\/td>\n<td>527,430.9293 ns<\/td>\n<td>467,553.7809 ns<\/td>\n<td>228,864,100.0 ns<\/td>\n<td>0.89<\/td>\n<td>0.01<\/td>\n<\/tr>\n<tr>\n<td>Cast_IL_Cached<\/td>\n<td>100000000<\/td>\n<td>227,966,553.8 ns<\/td>\n<td>355,027.3545 ns<\/td>\n<td>296,463.9203 ns<\/td>\n<td>227,903,600.0 ns<\/td>\n<td>0.89<\/td>\n<td>0.01<\/td>\n<\/tr>\n<tr>\n<td>Buffer<\/td>\n<td>100000000<\/td>\n<td>213,216,776.9 ns<\/td>\n<td>1,198,565.1142 ns<\/td>\n<td>1,000,856.1536 ns<\/td>\n<td>213,517,800.0 ns<\/td>\n<td>0.83<\/td>\n<td>0.01<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Acknowledgements<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e <a href=\"https:\/\/www.jetbrains.com\/\"><strong>JetBrains<\/strong><\/a> (\u0443 \u0432\u0430\u0441 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0439 \u043e\u0444\u0438\u0441 \u0432 \u0421\u041f\u0411 :-)) \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <a href=\"https:\/\/www.jetbrains.com\/resharper\/\"><strong>R#<\/strong><\/a> \u0437\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b <strong>VS<\/strong> \u0438 standalone-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <strong>dotPeek<\/strong>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430 \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e. \u0421\u043f\u0430\u0441\u0438\u0431\u043e <code>BenchmarkDotNet<\/code> \u0437\u0430 BenchmarkDotNet, youtube-\u043a\u0430\u043d\u0430\u043b\u0430\u043c <a href=\"https:\/\/www.youtube.com\/channel\/UCNPwMPudMEw-gnAT4zh_UZg\"><strong>NDC Conferences<\/strong><\/a> \u0438 <a href=\"https:\/\/www.youtube.com\/channel\/UCNPwMPudMEw-gnAT4zh_UZg\"><strong>DotNext<\/strong><\/a> \u0437\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u043e\u043a\u043b\u0430\u0434\u0430\u043c, \u0438 \u0432\u0430\u043c, \u0437\u0430 \u0442\u043e \u0447\u0442\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.<\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<h1 id=\"ps\">P.S.<\/h1>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<p><sup>3<\/sup> \u0423\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043f \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435 <code>ref<\/code>, \u0438 \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u0435\u0449\u0430\u043d\u043e. \u0420\u0435\u0448\u0435\u043d\u0438\u0435<s>\u043c<\/s> \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b (\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0441\u043f\u044d\u043d\u0430) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0432\u0441\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f <code>ref<\/code> structs, \u043c\u043e\u0436\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u0430\u043a\u0441\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u0438\u0434\u0430 <\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">static Raw Generated_Int32.GetRaw(Span&lt;int&gt; span) {     var inst = new Generated_Int32()     {         Span = span     };     return inst.Raw; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>Reflection.Emit<\/code>. \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u0446\u0435\u043b\u0430\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u043d\u043e \u043d\u0430\u043c <em>\u0434\u043e\u043b\u0436\u0435\u043d<\/em> \u043f\u043e\u043c\u043e\u0447\u044c <code>ILGenerator.DeclareLocal<\/code>. \u0414\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 \u043f\u0430\u0440\u0443 \u043c\u0435\u0442\u043e\u0434<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">static Span&lt;int&gt; Generated_Int32.GetSpan(Raw raw);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0438 \u043f\u0430\u0440\u0443 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">delegate Raw GetRaw&lt;T&gt;(Span&lt;T&gt; span) where T : unmanaged; delegate Span&lt;T&gt; GetSpan&lt;T&gt;(Raw raw) where T : unmanaged;<\/code><\/pre>\n<p>  <\/p>\n<p>\u043c\u043e\u0436\u043d\u043e, <em>\u044f \u043f\u043e\u043b\u0430\u0433\u0430\u044e<\/em>, \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 <code>ref<\/code> \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440. \u0422.\u043a. \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">var getter = type.GetMethod(@\"GetRaw\", BindingFlags.Static | BindingFlags.Public).CreateDelegate(typeof(GetRaw&lt;T&gt;), null) as GetRaw&lt;T&gt;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0430 \u0432\u044b\u0437\u043e\u0432 \u2014 \u043a\u0430\u043a<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">Raw raw = getter(Span&lt;TIn&gt;.Empty); Raw newRaw = convert(raw); Span&lt;TOut&gt; = setter(newRaw);<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p><em>UPD01: \u0411\u043e\u0440\u044c\u0431\u0430 \u0441 \u043e\u0447\u0435\u043f\u044f\u0442\u043a\u0430\u043c\u0438<\/em><\/p>\n<\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/465077\/\"> https:\/\/habr.com\/ru\/post\/465077\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/3f\/dh\/ia\/3fdhia5h25mpjbabeocnlygdd1c.png\"><\/p>\n<p>  <\/p>\n<p><code>C#<\/code> \u2014 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0433\u0438\u0431\u043a\u0438\u0439 \u044f\u0437\u044b\u043a. \u041d\u0430 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u044d\u043a\u044d\u043d\u0434 \u0438\u043b\u0438 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <code>C#<\/code> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0438 \u0441 \u043d\u0430\u0443\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432 \u044f\u0437\u044b\u043a\u0435. \u0425\u043e\u0442\u044f <code>netcore<\/code> \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0441\u0442\u043a\u0443 \u0434\u043d\u044f (\u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 <code>netstandard2.0<\/code> <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/update-on-net-core-3-0-and-net-framework-4-8\/\">\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e<\/a> \u0444\u0438\u0447 \u043a\u0430\u043a \u044f\u0437\u044b\u043a\u043e\u0432, \u0442\u0430\u043a \u0438 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430, \u043d\u0435 \u0431\u044d\u043a-\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 <code>netframework<\/code>), \u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0441 \u043b\u0435\u0433\u0430\u0441\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438.<br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e \u043e\u0434\u043d\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 (\u043d\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435?) \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 <code>Span&lt;T&gt;<\/code> \u0438 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>Span&lt;T&gt;<\/code> \u0432 <code>netframework<\/code> \u0438 <code>netcore<\/code> \u0438\u0437-\u0437\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 <code>clr<\/code>.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-293870","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/293870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=293870"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/293870\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=293870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=293870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=293870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}