我想创建一个私有成员变量,即使对于拥有它的类也是私有的,并且只能由其getter和setter访问。 我知道你可以使用像
这样的自动属性来做到这一点private int MyInt{ get; set;}
但我希望能够修改getter和setter(例如)我可以记录字段设置的次数(即使是拥有的类)。像这样的东西
private int MyInt
{
get{ return hiddenValue; }
set{ hiddenValue = value; Console.Out.WriteLine("MyInt has been set");}
}
其中“hiddenValue”是只能在getter和setter中访问的成员。 为什么?因为我是一个偏执的防守程序员,我甚至不相信自己:p。
这在C#中是否可行?如果是这样,语法是什么?
感谢。
答案 0 :(得分:6)
你真的应该相信自己。
不,即使封装类无法看到它,也无法将变量设置为私有。
如果确实想要这个,你可以将值封装在一个嵌套类中,这个类可以覆盖它自己的私有。
class Foo
{
class Bar // nested
{
private int _value;
public int Value
{
get { return _value; }
set { _value = value; /* logic */ }
}
}
}
Foo可以实例化一个Bar,获取bar.Value,但它无法获得_value。
答案 1 :(得分:4)
.Net中的任何语言都不可能。并且很好。防御性编码是好的,但是当变得偏执时,它会让其他需要维护它的开发人员变得疯狂。
答案 2 :(得分:3)
面向方面编程(AOP)可能有所帮助,简而言之,允许您在方法调用之前和/或之后注入您选择的代码。
查看http://code.google.com/p/easyprop/这是一个专门用于观察属性更改的AOP库,还有一些使用自动属性的示例。
注意:我还没有使用过这个库,但它看起来就在你的小巷里。
答案 3 :(得分:2)
你最好的选择可能是变得不那么偏执。 :P
答案 4 :(得分:1)
您尝试做的事情,无法在.NET中实现。
即使隐藏的支持字段也会在IL代码中可见。在设计时(在VS中)无法看到它的含义,它将在编译后出现。