5

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

谢谢。

4

5 回答 5

6

你真的应该相信自己。

不,你不能让一个变量如此私有,即使封装类也看不到它。

如果你真的想要这个,你可以将值封装在一个嵌套类中,它能够覆盖它自己的私有内容。

class Foo 
{
    class Bar // nested
    {
        private int _value;
        public int Value 
        {
            get { return _value; }
            set { _value = value; /* logic */ }
        }
    }
}

Foo 可以实例化 Bar,获取 bar.Value,但无法获取 _value。

于 2011-08-05T04:01:17.253 回答
4

.Net 中的任何语言都不可能。而且很好。防御性编码是好的,但是当变得偏执时,它会使其他需要维护它的开发人员发疯。

于 2011-08-05T04:03:23.900 回答
3

面向方面的编程 (AOP) 可能会有所帮助,简而言之,它允许您在方法调用之前和/或之后注入您选择的代码。

查看http://code.google.com/p/easyprop/这是一个专门为观察属性变化而设计的 AOP 库,并且有使用自动属性的示例。

注意:我还没有使用图书馆,但它看起来就在你的小巷里。

于 2011-08-05T04:05:32.043 回答
2

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

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

于 2011-08-05T04:00:31.310 回答
1

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

甚至隐藏的支持字段在 IL 代码中也是可见的。这意味着虽然您在设计时(在 VS 中)看不到它,但它会在编译后出现。

于 2011-08-05T04:02:27.357 回答