【发布时间】:2019-04-27 01:56:15
【问题描述】:
就本问题而言,“常量引用”是对无法调用修改对象或修改其属性的方法的对象的引用。
我想要这样的东西:
Const<User> user = provider.GetUser(); // Gets a constant reference to an "User" object
var name = user.GetName(); // Ok. Doesn't modify the object
user.SetName("New value"); // <- Error. Shouldn't be able to modify the object
理想情况下,我会用自定义属性(例如[Constant])标记类的每个不修改实例的方法,并且只能从常量引用中调用这些方法。如果可能,在编译期间调用其他方法会导致错误。
这个想法是我可以返回一个只读引用并确保它不会被客户端修改。
【问题讨论】:
-
这被称为“
const- 正确性”,这是 C++ 和 Swift 的语言特性,但不是 C#,不幸的是 - 但是你可以通过使用自定义属性来做一些事情,因为这样你可以通过 Roslyn 扩展执行它 - 但这是一个兔子洞。 -
其实是不可变的。
-
如果您将所有属性设为虚拟,您可以在从同一个对象继承时发出代理。在这种情况下,您实际上可以执行
User u = prov.GetUser(); // gets proxy -
@T.S.被覆盖的
virtual属性无法删除属性设置器,这意味着您不会收到编译器警告,即使被覆盖的设置器抛出NotSupportedException。 -
@Dai 没错。无法删除。但是 OP 说:“在编译期间调用其他方法会导致错误,如果可能。” 所以,我的建议是有效的。我喜欢它,因为它不是“太复杂”,从它继承的类发出代理
标签: c# const-correctness compile-time-constant