Twe*_*nty 19 c# keyword c#-11.0
在查看 new 的源代码时,DefaultInterpolatedStringHandler
我注意到 是ReadOnlySpan
用scoped
关键字注释的。我能找到的唯一文档是here。但是,我无法弄清楚以下代码片段之间的实际区别是什么。我假设使用scoped
关键字,参数不允许传递给被调用的方法,也不允许返回。即使事实证明这是真的,它有什么实际用途呢?
public void AppendFormatted(ReadOnlySpan<char> value)
{
// Omitted for brevity
}
// vs
public void AppendFormatted(scoped ReadOnlySpan<char> value)
{
// Omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*d L 22
正如我在评论中提到的,引用结构参数关键字的目的scoped
是允许将堆栈分配的局部变量传递给不捕获入站引用结构或从方法返回入站引用结构的方法。
在以下您链接的来源的非常简单的示例中:
public ref struct Test
{
private Span<char> _chars;
private int _pos;
public Test()
{
_chars = new char[3];
_pos = 0;
}
public void AppendFormatted(ReadOnlySpan<char> value)
{
// Fast path for when the value fits in the current buffer
if (value.TryCopyTo(_chars.Slice(_pos)))
{
_pos += value.Length;
}
}
public Span<char> GetBuffer() => _chars.Slice(0, _pos);
}
Run Code Online (Sandbox Code Playgroud)
如果从以下位置调用:
RunSpan();
void RunSpan()
{
var test = new Test();
Span<char> valuesToCopy = stackalloc char[1] { 'd' };
test.AppendFormatted(valuesToCopy);
}
Run Code Online (Sandbox Code Playgroud)
它会抛出以下错误
错误CS8352:无法在此上下文中使用变量“valuesToCopy”,因为它可能会在其声明范围之外公开引用的变量错误
CS8350:不允许使用“Test.AppendFormatted(ReadOnlySpan)”的这种参数组合,因为它可能会暴露参数“value”引用的变量超出其声明范围
但是,一旦添加关键字,scoped
您AppendFormatted(scoped ReadOnlySpan<char> value)
就可以调用该方法。
请注意,作用域不允许您从方法中错误地返回参数!下列:
public ref struct Test
{
private Span<char> _chars;
private int _pos;
public Test()
{
_chars = new char[3];
_pos = 0;
}
public ReadOnlySpan<char> AppendFormattedBad(scoped ReadOnlySpan<char> value) => value;
public Span<char> GetBuffer() => _chars.Slice(0, _pos);
}
Run Code Online (Sandbox Code Playgroud)
仍然返回以下错误:
错误CS8352:无法在此上下文中使用变量“ReadOnlySpan”,因为它可能会在其声明范围之外公开引用的变量
在处理 ref 结构时,此功能非常有用,因为您经常需要 stackalloc 传递给 ref 结构的方法的缓冲区。
归档时间: |
|
查看次数: |
5647 次 |
最近记录: |