如何将struct byref和readonly传递给C#中的函数?

时间:2013-07-31 04:35:13

标签: c# struct readonly byref

是否可以将结构byref和readonly传递给函数? (就像C ++中的T const&

struct A
{
    public int b;
}
void func1(ref A a)  // I want to make this `a` immutable
{

}

怎么做?

更新

我最关心的是有效地传递(1)不可变状态(2)。第二个问题是变异状态必须简单易行,就像可变对象一样。

3 个答案:

答案 0 :(得分:1)

目前我这样做。一种拳击。

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是可变的。此外,我还有机会优化与指针比较的相等比较。

答案 1 :(得分:0)

我不认为有一种方法可以使ref参数不可变。相反,你应该首先使你的结构不可变,以避免副作用。在这里阅读更多内容:

Why are mutable structs evil

答案 2 :(得分:0)

.NET中没有const ref的概念。如果结构很小,则应该按值传递它。如果它很大,你必须决定是否要信任结构的接收者不要修改它(在这种情况下,你可以有效地通过ref)或忍受传递值的低效率。

请注意,使结构假装是不可变的将无助于解决您的问题,但只会在您想要修改部分的情况下损害效率。人们应该经常避免使用构造方法来改变底层结构,因为编译器试图通过静默地将只读成员上的传递引用成员调用转换为传值来伪造“const ref”成员调用,但是没有这样的暴露字段的结构的问题。