gpt4 book ai didi

c# - 只读 ("const"-like) C# 的函数参数

转载 作者:可可西里 更新时间:2023-11-01 03:01:27 25 4
gpt4 key购买 nike

我有 C++ 背景,习惯于将 const 关键字添加到函数定义中,以使对象以只读值传递。但是,我发现这在 C# 中是不可能的(如果我错了请纠正我)。经过一番谷歌搜索后,我得出的结论是,创建只读对象的唯一方法是编写一个仅具有“get”属性的接口(interface),然后将其传入。优雅,我必须说。

public interface IFoo
{
IMyValInterface MyVal{ get; }
}

public class Foo : IFoo
{
private ConcreteMyVal _myVal;

public IMyValInterface MyVal
{
get { return _myVal; }
}
}

我会将它传递给:

public void SomeFunction(IFoo fooVar)
{
// Cannot modify fooVar, Excellent!!
}

这很好。但是,在我的其余代码中,我想正常修改我的对象。向界面添加“set”属性会打破我的只读限制。我可以向 Foo(而不是 IFoo)添加一个“set”属性,但是签名需要一个接口(interface)而不是一个具体的对象。我将不得不做一些类型转换。

// Add this to class Foo. Might assign null if cast fails??
set { _myVal = value as ConcreteMyVal; }

// Somewhere else in the code...
IFoo myFoo = new Foo;
(myFoo as Foo).MyFoo = new ConcreteMyVal();

是否有更优雅的方法来复制 const 或在不添加其他属性或函数的情况下制作只读函数参数?

最佳答案

我认为您可能正在寻找一种涉及两个接口(interface)的解决方案,其中一个接口(interface)继承另一个接口(interface):

public interface IReadableFoo
{
IMyValInterface MyVal { get; }
}

public interface IWritableFoo : IReadableFoo
{
IMyValInterface MyVal { set; }
}

public class Foo : IWritableFoo
{
private ConcreteMyVal _myVal;

public IMyValInterface MyVal
{
get { return _myVal; }
set { _myVal = value as ConcreteMyVal; }
}
}

然后您可以声明其参数类型“告诉”它是否计划更改变量的方法:

public void SomeFunction(IReadableFoo fooVar)
{
// Cannot modify fooVar, excellent!
}

public void SomeOtherFunction(IWritableFoo fooVar)
{
// Can modify fooVar, take care!
}

这模仿类似于 C++ 中常量的编译时检查。正如 Eric Lippert 正确指出的那样,这与不变性相同。但作为一名 C++ 程序员,我想你知道这一点。

顺便说一句,如果您将类中的属性类型声明为 ConcreteMyVal 并单独实现接口(interface)属性,则可以实现稍微更好的编译时检查:

public class Foo : IWritableFoo 
{
private ConcreteMyVal _myVal;

public ConcreteMyVal MyVal
{
get { return _myVal; }
set { _myVal = value; }
}

public IMyValInterface IReadableFoo.MyVal { get { return MyVal; } }
public IMyValInterface IWritableFoo.MyVal
{
// (or use “(ConcreteMyVal)value” if you want it to throw
set { MyVal = value as ConcreteMyVal; }
}
}

这样,setter 只能在通过接口(interface)访问时抛出,而在通过类访问时不会抛出。

关于c# - 只读 ("const"-like) C# 的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3826542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com