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

时间:2019-03-26 00:25:20

标签: c# optimization struct

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

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方法执行复制吗?

1 个答案:

答案 0 :(得分:2)

不幸的是,我想您已经知道答案了。

有了您已确定的约束,就无法实现您想要的目标。

您唯一可以执行此操作的方法是使用ref return。但是,您不能返回在本地创建的值类型引用。因此,您无法减轻防御性副本

您还排除了使用ref / in / out修饰符,它们也会减轻防御性复制

因此,您陷入困境,无法实现想要的目标。

  • 如果您不想复制
  • ,则必须放弃Create类型的方法
  • 或者您将不得不开始使用允许通过 reference ,通过使用 readonly 和/或{{1 }} / in / ref修饰符,或将out non-local 类型一起使用。

简而言之,您将需要重构您的工作流程以迎合无复制代码。