gpt4 book ai didi

c# - 返回新结构时如何防止复制?

转载 作者:行者123 更新时间:2023-11-30 16:38:20 25 4
gpt4 key购买 nike

我有一个以 transient 方式使用的结构,看起来像这样:

internal readonly struct TrackingId
{
public readonly string Source1;
public readonly string Source2;
public readonly string SourceN;

// Computed from Source1..N
public readonly string Value;

private TrackingId(string source1, string source2, string sourceN)
{
Source1 = source1;
Source2 = source2;
SourceN = sourceN;

Value = String.Join("-", Source1, Source2, SourceN);
}

public static TrackingId Create(string source1, string source2, string sourceN)
{
return new TrackingId(source1, source2, sourceN);
}
}

实际类型有很多字段,所以执行复制是非常不可取的行为。但是,我的理解是运行时会将新实例复制到调用方,除非/直到它决定内联 Create 方法,但不能保证会发生这种情况。

我本质上是在寻找类似于 C++ 的复制省略的东西,其中返回的对象是在调用者的存储中就地构造的;有什么方法可以可靠地阻止 Create 方法执行复制?

最佳答案

不幸的是,我想你已经知道这里的答案了。由于您已确定的限制,无法实现您想要的。

您能够做到这一点的唯一方法是使用 ref 返回。然而,您不能返回本地创建的值类型引用。因此,您无法减轻防御性副本

您还排除了使用 ref/in/out 修饰符,这些也会减轻防御性副本.

所以,你被困住了,无法实现你想要的。

  • 如果您不想复制,则必须放弃 Create 类型的方法
  • 或者你将不得不开始使用允许通过引用传递结构的语言特性,通过使用readonly和/或 in/ref/out 修饰符,或对 非本地 类型使用 ref return

简而言之,您将需要重构您的工作流程以适应无副本代码。

关于c# - 返回新结构时如何防止复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55348219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com