Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#具有非自动属性的匿名支持字段_C#_.net_C# 4.0_C# 3.0_Defensive Programming - Fatal编程技术网

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

C#具有非自动属性的匿名支持字段,c#,.net,c#-4.0,c#-3.0,defensive-programming,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; Co

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

谢谢。

不,这在C#中是不可能的。
你最好的选择可能是少一些偏执你真的应该相信自己

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

如果确实需要,可以将该值封装在一个嵌套类中,这样就可以覆盖它自己的隐私

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

Foo可以实例化一个Bar,获取Bar.Value,但它无法获取_值。

您试图做的事情在.NET中无法实现


即使隐藏的备份字段也将在IL代码中可见。这意味着,虽然您在设计时(VS中)无法看到它,但它将在编译后出现

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

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

看看哪一个是专门为观察属性变化而设计的AOP库,这里有一些使用自动属性的示例


注:我还没有用过这个库,但它看起来很适合你。

+1但他可以使用反射来改变值,不管怎样,仍然不够偏执。老鼠,这将很方便在维护期间防止代码白痴。好吧,没有什么是防白痴的,但它会有帮助的。不幸的是,将其放入封装类会增加太多的代码复杂性和出错的机会:p@Bryan你知道什么会毁了你的一天吗?你准备好了吗?不同的Foos实例可以看到彼此的隐私。你不仅不能从一个实例中隐藏一个成员,也不能从同一类的另一个实例中隐藏它。@BrokenGlass是的,但是他们必须努力绕过访问器。这更能确保即使是在内部引起更改时也能触发onChange事件。如何对匿名支持成员使用反射?过去几年我一直在java领域,所以我只是重新刷上了我的C,但是我似乎记得需要通过反射来修改它的名称。布莱恩,考虑到一旦编译,它不是“匿名”。自动实现的属性可以节省定义后退字段的麻烦,但这并不意味着没有。您刚刚将创建它的负担卸给了编译器。需要防御性编程正是因为其他开发人员需要维护它!尽管如此,我还是喜欢使用漂亮的解决方案(AOP,代码契约),但是当你开始检查发送方和参数是否有空引用,并且不打算在以后的代码中使用它们时,我想知道为什么这种偏执会适得其反。@Mark H。。。确切地我总是认为在我之后工作的人是个十足的白痴。即使我是那个白痴。如果我可以保证访问器总是被调用,那么我就可以肯定地知道我的事件总是被触发的,并且数据总是经过验证的。不过,我认为这是更好的框架。我现在正在给PostSharp看一看。这对解决这个问题没有多大帮助,但总的来说,它看起来确实很有帮助:p有比偏执狂更充分的理由来努力做到这一点:)。对于缓存属性来说,这并不少见,即在第一次访问时,通过数据库等检索值并将其存储在备份字段中,对于后续访问,getter使用备份字段。在这一点上,开发商,尤其是新加入项目的开发商,可能不清楚是使用地产还是支持领域。