我有一个以 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/