首页> C#>如何防止复制时返回一个新的结构?

我有一个临时使用的结构,看起来像这样:

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 type方法
>否则,您将不得不开始使用允许通过引用传递结构,通过使用readonly和/或in / ref / out修饰符或对非本地类型使用ref return的语言功能.

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

上一篇:python中的高效字符串比较,包括数值评估


下一篇:如何优化我的PageRank计算?