根据我的经验,提高应用程序性能的主要方法是减少IO调用的次数和持续时间。然而,一旦执行了这个选项,开发人员采取的另一种方式就是在堆栈上使用内存。堆栈允许非常快的分配和释放,尽管它应该只用于分配小的部分,因为堆栈大小是非常小的。另外,使用堆栈可以减少GC的压力。为了在堆栈上分配内存,将值类型或stackalloc操作符与非托管内存的使用结合使用。
第二个选项很少被开发人员使用,因为用于非托管内存访问的API非常冗长。
Span是C# 7.2中到达的一组值类型,它是来自不同来源的内存的无分配表示。Span允许开发人员以更方便的方式处理连续内存区域,确保内存和类型安全。
Span实现
Ref返回
对于那些不密切关注C#语言更新的人来说,了解Span实现的第一步是了解C# 7.0中引入的ref返回值。
虽然大多数读者都熟悉通过引用传递方法参数,但现在C#允许返回对值的引用,而不是值本身。
让我们来看看它是如何工作的。我们将为一组杰出的音乐家创建一个简单的包装,它既展示了传统的行为,又展示了新的ref返回特性。
public class ArtistsStore { private readonly string[] _artists = new[] { "Amenra", "The Shadow Ring", "Hiroshi Yoshimura" }; public string ReturnSingleArtist() { return _artists[1]; } public ref string ReturnSingleArtistByRef() { return ref _artists[1]; } public string AllAritsts => string.Join(", ", _artists); }
现在我们调用这些方法。
var store = new ArtistsStore(); var artist = store.ReturnSingleArtist(); artist = "Henry Cow"; var allArtists = store.AllAritsts; //Amenra, The Shadow Ring, Hiroshi Yoshimura artist = store.ReturnSingleArtistByRef(); artist = "Frank Zappa"; allArtists = store.AllAritsts; //Am