是否可以将结构 byref 和 readonly 传递给函数?(就像T const&
在 C++ 中一样)
struct A
{
public int b;
}
void func1(ref A a) // I want to make this `a` immutable
{
}
怎么做?
更新
我最关心的是有效地传递(1)不可变状态(2)。第二个问题是改变状态必须像可变对象一样简单易行。
目前我正在这样做。一种拳法。
class
ImmutableBox<T> where T : struct, new()
{
public readonly T state;
ImmutableBox(T state)
{
this.state = state;
}
}
struct
ExampleStateA
{
public string someField;
}
void
func1(ImmutableBox<ExampleStateA> passImmutableStateWithBox)
{
}
通过保留 的实例ImmutableBox<T>
,我可以通过指针副本传递不可变对象,并且它仍然很容易编辑State
,因为State
它是可变的。我也有机会将相等比较优化为指针比较。
唉,.NET 中没有概念const ref
。如果结构很小,则应按值传递。如果它很大,您必须决定是要信任结构的接收者不要修改它(在这种情况下,您可以有效地传递ref
)还是忍受传递值的低效率。
请注意,将结构伪装成不可变不会对您的问题有任何帮助,但在您想要修改部分的情况下只会降低效率。人们应该经常避免使用改变底层结构的结构方法,因为编译器试图通过将只读成员上的按引用传递成员调用静默转换为按值传递来伪造“const ref”成员调用,但没有这样的暴露字段的结构的问题。
我认为没有办法使 ref 参数不可变。相反,您应该首先使您的结构不可变以避免副作用。在这里阅读更多: