标签: system.memory

C#7.2中Span <T>和Memory <T>有什么区别?

C#7.2引入了两个新类型:Span<T>Memory<T>有超过早先C#类型,如更好的性能string[].

问题:Span<T>和之间有什么区别Memory<T>?为什么我会使用一个而不是另一个?

c# c#-7.2 system.memory

57
推荐指数
3
解决办法
2万
查看次数

Span <T>不需要局部变量赋值.这是一个功能吗?

我注意到,即使未初始化局部变量,以下内容也将编译并执行.这是Span的一个特色吗?

void Uninitialized()
{
  Span<char> s1;
  var l1 = s1.Length;

  Span<char> s2;
  UninitializedOut(out s2);
  var l2 = s2.Length;
}

void UninitializedOut(out Span<char> s)
{}
Run Code Online (Sandbox Code Playgroud)

c# c#-7.2 system.memory

14
推荐指数
2
解决办法
670
查看次数

在数组中,只读结构应该是不可变的吗?

(注意:此示例代码需要C#7.2或更高版本以及Nuget System.Memory包.)

我们假设我们有readonly struct如下:

public readonly struct Test
{
    public Test(int value)
    {
        Value = value;
    }

    public int Value { get; }
}
Run Code Online (Sandbox Code Playgroud)

现在让我们把它放到一个数组中:

var array = new Test[] { new Test(1) };

Console.WriteLine(array[0].Value); // Prints 1
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.您无法编写代码来array[0].Value直接修改.

现在假设我们这样做:

array.AsSpan().AsBytes()[3] = 1;

Console.WriteLine(array[0].Value); // Prints 16777217
Run Code Online (Sandbox Code Playgroud)

所以现在我们已经修改Value了数组中readonly结构的组件.

这种行为是否正确?

c# immutability c#-7.2 system.memory

12
推荐指数
1
解决办法
776
查看次数

使用Span <T>替代Substring

我已经阅读了一些关于如何使用Span来替换某些字符串操作的文章.因此,我更新了代码库中的一些代码以使用这个新功能,但是,为了能够就地使用它,我必须调用它.ToString().

是否.ToString()有效地否定我使用得到利益Span<T>,而不是Substring因为这将有分配内存?在这种情况下,如果以这种方式跨越,或者只是不可能,我如何获得好处?

//return geofenceNamesString.Substring(0, 50); Previous code
return geofenceNamesString.AsSpan().Slice(0, 50).ToString();
Run Code Online (Sandbox Code Playgroud)

c# substring system.memory

6
推荐指数
1
解决办法
172
查看次数

查找数组中 Span&lt;T&gt; 的位置

Span指向一个内存区域。鉴于我知道它是什么内存区域(即数组),我可以(有效地)找出它指向的数组中的第一个元素吗?我认为由于它指向非固定内存,因此该信息必须存储在某个地方,因为地址必须由 GC 更新。

var buffer = new byte[100];
var span = new Span<byte>(buffer);
span = span.Slice(10, 5);
// How can I figure out where in buffer this span starts?
Run Code Online (Sandbox Code Playgroud)

c# performance system.memory

6
推荐指数
0
解决办法
1163
查看次数

如何并行对 Span&lt;T&gt; 进行操作?

我想并行执行操作Span<T>,但这样的操作是不合法的:

void DoSomething(Span<int> buffer, int option1, int option2)
{
   ....... 
}

void ParallelDoSomething(Span<int> buffer)
{
    var size = buffer.Length;
    Parallel.Invoke(() => DoSomething(buffer, 0, size / 2),
        () => DoSomething(buffer, size/2, size)); //not legal
}
Run Code Online (Sandbox Code Playgroud)

因为编译器抱怨:不能在匿名方法、lambda 表达式、查询表达式或本地函数中使用 ref、out 或 in 参数“缓冲区”

如何在以Span<T>参数为参数的并行方法中执行?

c# parallel-processing system.memory

6
推荐指数
1
解决办法
1399
查看次数

Span <T>可以使哪些常见操作更有效?

假设我有一个Web应用程序,我想利用新Span<T>类型来降低GC压力并提高性能.

我应该注意哪些模式?在实现这个新功能时,.NET团队是否有任何典型的操作?

c# c#-7.2 system.memory

5
推荐指数
1
解决办法
544
查看次数

通过 Span&lt;T&gt; 实现子串

一个SubstringFromStart方法的实现在什么时候Span<T>应该被利用?假设substringLength <= input.Length

 ReadOnlySpan<char> span = input.AsSpan().Slice(0, substringLength);
 return new string(span.ToArray());
Run Code Online (Sandbox Code Playgroud)

这是要走的路吗?有没有比 更好、更简洁的方法new string(span.ToArray())

c# c#-7.2 system.memory

5
推荐指数
1
解决办法
1567
查看次数

Span <T>和不在.NET Native UWP应用程序中工作的朋友

重现步骤:

  1. 使用最新更新打开Visual Studio 2017.
  2. 创建一个UWP项目目标10240(这不是强制性的,它在所有版本中都被破坏)
  3. System.Memory从nuget包安装(点击包括预发布)
  4. 将此代码复制粘贴到MainPage.cs中

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
       void Recursive(ReadOnlySpan<char> param)
       {
           if (param.Length == 0) return;
    
           tx1.Text += Environment.NewLine;
    
           tx1.Text += new string(param.ToArray());
           Recursive(param.Slice(1));
       }
    
       ReadOnlySpan<char> mySpan = "Why things are always broken in Visual Studio".AsSpan();
    
       Recursive(mySpan);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 将其粘贴到MainPage.xaml

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
       <TextBlock x:Name="tx1" HorizontalAlignment="Left"   FontSize="48" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
    </Grid>
    
    Run Code Online (Sandbox Code Playgroud)
  6. 从Debug切换到Release x64并确保"使用.Net Native工具链编译".

  7. 点击播放.

  8. 收到此错误:

------ Build build:项目:App12,配置:发布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):错误:内部编译器错误:对象引用不设置为对象的实例.
==========构建:0成功,1失败,0最新,0跳过==========
==========部署:0成功,0失败,0跳过==========

我做错了什么?这适用于没有.NET Native的调试和发布.谢谢.

c# .net-native uwp system.memory

5
推荐指数
1
解决办法
513
查看次数

为 Memory&lt;byte&gt; / Span&lt;byte&gt; 获取可变结构的正确方法?

对于网络协议实现,我想利用 newMemorySpanclasses 在通过struct.

我有以下人为的例子:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Data
{
    public int IntValue;
    public short ShortValue;
    public byte ByteValue;
}

static void Prepare()
{
    var buffer = new byte[1024];
    var dSpan = MemoryMarshal.Cast<byte, Data>(buffer);
    ref var d = ref dSpan[0];

    d.ByteValue = 1;
    d.ShortValue = (2 << 8) + 3;
    d.IntValue = (4 << 24) + (5 << 16) + (6 << 8) + 7;
}
Run Code Online (Sandbox Code Playgroud)

结果是buffer充满了7, 6, 5, …

c# struct system.memory

5
推荐指数
1
解决办法
633
查看次数