C#匿名支持具有非自动属性的字段

时间:2011-08-05 03:56:15

标签: c# .net c#-4.0 c#-3.0 defensive-programming

我想创建一个私有成员变量,即使对于拥有它的类也是私有的,并且只能由其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#中是否可行?如果是这样,语法是什么?

感谢。

5 个答案:

答案 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)

不,这在C#中是不可能的。

你最好的选择可能是变得不那么偏执。 :P

答案 4 :(得分:1)

您尝试做的事情,无法在.NET中实现。

即使隐藏的支持字段也会在IL代码中可见。在设计时(在VS中)无法看到它的含义,它将在编译后出现。