This article mainly introduces the simple implementation code of using ref and Span
##1. Preface
In fact, when it comes to ref, many students already know it. Ref is a language feature of C# 7.0. It provides developers with a mechanism to return local variable references and value references.Span is also a complex data type based on ref syntax. In the second half of the article, I will have an example showing how to use it.
2. Ref keyword
Whether it is the ref or out key, it is a language feature that is relatively difficult to understand and operate, such as Like manipulating pointers in C language, such high-level syntax always brings some side effects, but I don’t think this has anything, and not every C# developer needs to have a deep understanding of these internal operating mechanisms. I think no matter What is complicated is that it only provides people with a free choice. Risk and flexibility are never compatible. Let’s look at a few examples to illustrate the identity of references and pointers. Of course, the following usage methods can be used before C# 7.0:
public static void IncrementByRef(ref int x) { x++; } public unsafe static void IncrementByPointer(int* x) { (*x)++; }
int i = 30; IncrementByRef(ref i); // i = 31 unsafe{ IncrementByPointer(&i); } // i = 32
1.ref locals (referencing local variables)
int i = 42; ref var x = ref i; x = x + 1; // i = 43
2.ref returns (return value reference)
ref returns is a powerful feature in C# 7. The following code best reflects its features. This function Provided, returns a reference to an item in the int array:public static ref int GetArrayRef(int[] items, int index) => ref items[index];
3. Span
System.Span is part of the .Net Core core, under the System.Memory.dll assembly. Currently this feature is independent and may be integrated into CoreFx in the future;How to use it? Reference the following NuGet package under the project created by .Net Core 2.0 SDK:<ItemGroup> <PackageReference Include="System.Memory" Version="4.4.0-preview1-25305-02" /> <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.4.0-preview1-25305-02" /> </ItemGroup>
The characteristics of Span are as follows:
•Abstracts the type system of all continuous memory spaces, including: arrays, unmanaged pointers, stack pointers , fixed or pinned managed data, and references to internal areas of values•Support CLR standard object types and value types
•Support generics
•Support GC, unlike pointers that need to be managed by themselves.
public struct Span<T> { ref T _reference; int _length; public ref T this[int index] { get {...} } ... } public struct ReadOnlySpan<T> { ref T _reference; int _length; public T this[int index] { get {...} } ... }
string content = "content-length:123",To convert 123 to an integer, the usual approach is to first use Substring to truncate the string that has nothing to do with numeric characters. The conversion code is as follows:
string content = "content-length:123"; Stopwatch watch1 = new Stopwatch(); watch1.Start(); for (int j = 0; j < 100000; j++) { int.Parse(content.Substring(15)); } watch1.Stop(); Console.WriteLine("\tTime Elapsed:\t" + watch1.ElapsedMilliseconds.ToString("N0") + "ms");
string content = "content-length:123"; ReadOnlySpan<char> span = content.ToCharArray(); span.Slice(15).ParseToInt(); watch.Start(); for (int j = 0; j < 100000; j++) { int icb = span.Slice(15).ParseToInt(); } watch.Stop(); Console.WriteLine("\tTime Elapsed:\t" + watch.ElapsedMilliseconds.ToString("N0") + "ms");
public static class ReadonlySpanxtension { public static int ParseToInt(this ReadOnlySpan<char> rspan) { Int16 sign = 1; int num = 0; UInt16 index = 0; if (rspan[0].Equals('-')){ sign = -1; index = 1; } for (int idx = index; idx < rspan.Length; idx++){ char c = rspan[idx]; num = (c - '0') + num * 10; } return num * sign; } }
4. The last two paragraphs
The time for the code to be called 100,000 times is as follows:String Substring Convert: Time Elapsed: 18ms ReadOnlySpan Convert: Time Elapsed: 4ms
The above is the detailed content of Code Analysis: Using ref and Span