我有一个结构,该结构以短暂的方式使用,看起来像这样:
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
方法执行复制吗?
答案 0 :(得分:2)
不幸的是,我想您已经知道答案了。
有了您已确定的约束,就无法实现您想要的目标。
您唯一可以执行此操作的方法是使用ref return
。但是,您不能返回在本地创建的值类型的引用。因此,您无法减轻防御性副本。
您还排除了使用ref
/ in
/ out
修饰符,它们也会减轻防御性复制。
因此,您陷入困境,无法实现想要的目标。
Create
类型的方法
in
/ ref
修饰符,或将out
与 non-local 类型一起使用。 简而言之,您将需要重构您的工作流程以迎合无复制代码。