我有一个临时使用的结构,看起来像这样:
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的语言功能.
简而言之,您将需要重构您的工作流以迎合无复制代码.