我有一个在WCF服务中运行的RabbitMQ C#Client.
它偶尔会发现System.NotSupportedException: Pipelining of requests forbidden 异常.
var a = new bool[]{true,false};
var b = new bool[4];
a=b; //operation 1
a[1]=true; //operation 2
Run Code Online (Sandbox Code Playgroud)
我知道在C#中定义了一些atmoic类型,从那里我找不到数组.
.NET Standard 2.1 引入了一项新功能,您可以在其中“控制”内存块而不是复制它们:Span或Memory。
在文档示例中,我注意到可以引用堆栈缓冲区:
byte data = 0;
Span<byte> stackSpan = stackalloc byte[100];
for (int ctr = 0; ctr < stackSpan.Length; ctr++)
stackSpan[ctr] = data++;
Run Code Online (Sandbox Code Playgroud)
据我所知,一个进程的堆栈内存是有限的(1MB 或 4MB),我们无法手动释放它。
所以我想创建一个Memory<T>orSpan<T>会以某种方式“固定”堆栈上的内存位置,以便我们可以索引它?但这不是可能导致堆栈溢出的堆栈泄漏的潜在情况吗?由于堆栈上的数组应该与Memory<T>or一样长Span<T>。
根据文档:
您不能将 ref 结构声明为类或普通结构的成员。
但我成功地编译并运行了这个:
public ref struct RefStruct
{
public int value;
}
public class MyClass
{
public RefStruct Item => default;
}
...
MyClass c = new MyClass();
Console.WriteLine(c.Item.value);
Run Code Online (Sandbox Code Playgroud)
现在RefStruct是 aref struct并且它是一个类的成员。这种说法在某些情况下是错误的吗?
更新 现在文档已更新为更准确的描述。