关于基础编程哪些效率优化总结
#### Span<T>
> C# 7.2+支持。 C#对内存指向处理比较弱,没有C++的指针。在很多场景下因此也导致了部分资源的不要浪费。
##### 如何创建Span<T>
```
byte[] bytes = new byte[10];
// 可以直接隐式转换
Span<byte> spanBytes = bytes;
// 生成Span编制索引
var aaa = spanBytes.Slice(start:2,length:2);
```
##### 字符串截取之 AsSpan
```
string value = "123456789";
value = value.AsSpan(0,5)
// 想过等价于
value.SubString(0,5)
// 为什么 Span 效率高 请参考 MSDN文档,内容过多这里不解释
```
#### StringBuilder 设定合理的起始容量
```
// 假设我有一个字符串拼接的需求, 内容最大500字节
// 那么
StringBudiler sb = new ..
sb.Capacity = 500;
// 这样可以有效的减少 扩容带来的 内存拷贝和空间分配上带来的效率影响
```
#### 内存申请
##### Stackalloc
> 请先看下介绍:stackalloc 关键字用于不安全的代码上下文中,以便在堆栈上分配内存块。
```
// 该数组的内存是在堆栈上分配的
int* block = stackalloc int[20];
// 该块地址存储在fib指针中。此内存不受垃圾回收制约。
// 该内存块的生命周期限定于它的方法作用范围,并且不能在方法返回之前进行释放
// 注:stackalloc 容易出现堆栈溢出,并且无法手动处理异常。请则情使用
```
##### AllocHgGlobal
> 除了使用stackalloc 之外还可以使用 Marshal.AllocHGGlobal申请一段内存。 但是需要注意的是: 申请的内存需要自己主动释放
```
// 申请长度
int length = 20;
IntPtr ptr = Marshal.AllocHGlobal(length)
try{
var bytes = new Span<byte>((byte*)ptr,length){ [0] = 1 };
}finally{
Marshal.FreeHGGlobal(ptr);
}
// 注: 不要使用比自己申请的内存大的数组! 如有疑问请查阅 MSDN 相关说明
```