问题标签 [system.memory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 跨度有什么区别和记忆在 C# 7.2 中?
C# 7.2 引入了两种新类型:它们比早期的 C# 类型(Span<T>
如.Memory<T>
string[]
问题:Span<T>
和 和有什么不一样Memory<T>
?为什么我要使用其中一个?
c# - Span可以让哪些常见操作更高效?
假设我有一个 Web 应用程序,我想利用新Span<T>
类型来降低 GC 压力并提高性能。
我应该注意哪些模式?.NET 团队在实现此新功能时是否考虑过任何典型操作?
c# - 只读结构在数组中是否应该是不可变的?
(注意:此示例代码需要 C# 7.2 或更高版本,以及Nuget System.Memory包。)
假设我们有一个readonly struct
如下:
现在让我们把它放到一个数组中:
到目前为止,一切都很好。您不能编写代码array[0].Value
直接修改。
现在假设我们这样做:
所以现在我们已经修改Value
了数组中只读结构的组件。
这种行为正确吗?
c# - 通过 Span 实现子字符串
什么时候应该利用一个SubstringFromStart
方法的实现会是什么样子?Span<T>
假设substringLength <= input.Length
:
这是要走的路吗?有没有比 更好、更简洁的方法new string(span.ToArray())
?
c# - 替代使用 Func 返回 Span或其他参考结构
如何将返回 Span 的方法作为参数传递?
此代码返回错误“类型 'Span' 可能不用作类型参数”(这是有道理的,因为使用 ref 结构作为泛型类型参数可能导致装箱,因此被禁止)。
c# - 跨度不需要局部变量赋值。这是一个特点吗?
我注意到即使未初始化局部变量,以下内容也会编译和执行。这是 Span 的一个特性吗?
c# - 跨度不能是嵌套的局部变量。为什么这是一个限制?
以下不编译。既然这不是匿名方法、lambda 表达式或查询表达式,为什么这是一个限制?(将文本作为参考 ReadOnlySpan 工作正常。)
c# - 跨度和不在 .NET Native UWP 应用程序中工作的朋友
重现步骤:
- 打开带有最新更新的 Visual Studio 2017。
- 在 10240 中创建一个 UWP 项目(这不是强制性的,它在所有版本中都已损坏)
System.Memory
从 nuget 包安装(单击包含预发行版)将此代码复制粘贴到 MainPage.cs
/li>将此复制粘贴到 MainPage.xaml
/li>从 Debug 切换到 Release x64 并确保“使用 .Net Native 工具链编译”。
单击播放。
收到此错误:
------ 构建开始:项目:App12,配置:Release x64 ------
App12 c:\Users\myuser\documents\visual studio 2017\Projects\App12\App12\bin\x64\Release\App12 .exe
处理应用程序代码
C:\Users\myuser.nuget\packages\microsoft.net.native.compiler\1.7.3\tools\Microsoft.NetNative.targets(697,5): error : Internal compiler error: Object reference not设置为对象的实例。
========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========
========= 部署:0成功,0失败,0跳过==========
我做错了什么?这适用于没有 .NET Native 的调试和发布。谢谢。
c# - 获取内存可变结构的正确方法/ 跨度?
对于网络协议实现,我想利用 newMemory
和Span
类来实现缓冲区的零拷贝,同时通过struct
.
我有以下人为的例子:
结果是buffer
填充了7, 6, 5, 4, 3, 2, 1
,这是所需的,但我很难想象这MemoryMarshal.Cast
是唯一的方法(禁止任何需要unsafe
关键字的内容)。我尝试了其他一些方法,但我不知道如何将它们与 a ref struct
(不能用作泛型类型参数)或如何获取实际缓冲区中的结构而不是副本(在所做的任何突变都不会反映在缓冲区中)。
有没有更简单的方法从缓冲区中获取这个可变结构?
c# - 使用 ReadOnlySpan 处理转义序列
据说ReadOnlySpan<char>
它非常适合解析,所以我尝试使用它,但遇到了一个我不知道如何处理的用例。
我有一个命令行string
,其中参数前缀-
和分隔符(空格)被转义(我知道我可以在这里引用它们,但为了这个问题,让我们假设它不是一个选项):
标记器应返回以下标记:
foo
- 命令名称bar
- 参数名称-baz qux
- 参数值
案例1
&2
很简单,因为在这里我可以使用str.Slice(i, length)
,但是如何创建3rd
案例并只返回一个ReadOnlySpan<char>
?该Slice
方法不允许我指定跳过转义字符start/length
所需的多个范围。\
例子:
在哪里(10,4) = "-bar"
和(15,3) = " qux"
StringBuilder
您可以Append
稍后跳过几个字符和其他字符。我将如何获得相同的结果ReadOnlySpan<char>
?