你可以在C#中手动复制C++ const的行为。
无论Foo
是什么,调用者修改它的状态的唯一方式就是通过调用其方法或设置属性。
例如,Foo
的类型是FooClass
:
class FooClass
{
public void MutateMyStateYouBadBoy() { ... }
public string Message
{
get { ... }
set { ... }
}
}
所以在你的情况下,你希望他们可以获取Message
属性,但不允许设置它,并且你绝对不希望他们调用该方法。
因此,定义一个描述他们被允许做什么的接口:
interface IFooConst
{
public string Message
{
get { ... }
}
}
我们省略了可变方法,只保留了属性的getter。
然后将该接口添加到FooClass
的基本列表中。
现在,在具有Foo
属性的类中,您有一个字段:
private FooClass _foo
还有一个属性的获取器:
public IFooConst Foo
{
get { return _foo; }
}
这基本上是手动复制了 C++ 中
const
关键字自动执行的操作。在伪代码 C++ 中,类型为
const Foo &
的引用就像是一个自动生成的类型,只包括那些被标记为
const
成员的
Foo
成员。将其转换为某个理论上未来版本的 C#,你可以这样声明
FooClass
:
class FooClass
{
public void MutateMyStateYouBadBoy() { ... }
public string Message
{
get const { ... }
set { ... }
}
}
其实我所做的就是将
IFooConst
中的信息合并回到
FooClass
中,通过给一个安全成员打上新的
const
关键字。因此,在某种程度上,添加一个const关键字除了提供一种正式的方法来处理这种模式之外,并没有为语言增加太多东西。
然后,如果您有一个对
FooClass
对象的
const
引用:
const FooClass f = GetMeAFooClass()
您只能在f
上调用const成员。
请注意,如果FooClass
定义为public,则调用者可以将IFooConst
强制转换为FooClass
。但是他们在C++中也可以这样做 - 这被称为“去除const
”,涉及到一个名为const_cast<T>(const T &)
的特殊运算符。
还有一个问题,即接口在产品版本之间不太容易演变。如果第三方可能实现您定义的接口(如果他们可以看到它),则您不能在将来的版本中添加新方法而不需要要求其他人重新编译其代码。但是,只有当您正在编写可扩展的库供其他人构建时,才会出现此问题。也许内置的const
功能可以解决此问题。