有一个问题?

如果您有任何疑问,可以在下面询问或输入您要查找的内容!

关于基础编程哪些效率优化总结

#### 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 相关说明


```








发表评论