生活中的诡异事件,C#中诡异的属性

老衲事先声明,本文代码是在Visual Studio 2008和.NET Reflector 7.0.0.420下做的测试演示,未在Visual Studio 2010下做测试,有时间测试补上。
首先需要解释一下什么是属性。
摘取msdn上的解释:
属性是这样的成员:它提供灵活的机制来读取、编写或计算某个私有字段的值。可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。
从下面的实例开始。
有如下类A:
class A { public void Display() { Console.Write("aa"); } }
然后有类B,注意哦,Displsy前没有加new哦,如下:
class B:A { public void Display() { Console.Write("bb"); } }
客户端代码如下:
class Program { static void Main(string[] args) { B b = new B(); b.Display(); Console.ReadKey(); } }
输出必然是bb,老衲就不解释了!
如果只讲到这儿,什么砖头啊,西瓜刀啊什么的就飞过来了!
放心,老衲不会让你白白看这么久的!
为A加上一个属性Aa,代码如下:
class A { public void Display() { Console.Write("aa"); } private string aa = "aa"; public string Aa { get { return aa; } set { aa = value; } } }
非常简单的A类哈!请出大神.NET Reflector,看看A到底变成什么样了!
Look!
C#中诡异的属性生活中的诡异事件
Aa属性在A类中会生成两个方法,set_Aa(String)和get_Aa()。各位施主,如果你是菜鸟一级的话,有必要弄清楚这里为什么是String而不是string哦,可以帮助你理解在C#中string和String的区别哦,这将是一般.net面试的一个送分题哦!
如果施主您觉得老衲只写到这就停下来了,你就太不了解老衲了!
好戏才刚刚开始,老衲要让那些实属菜鸟一级却自认高手的童鞋觉得自己懂的是多么的少,老衲先声明一下哈,老衲写过一两年代码,不过尘世中一个迷途小码农!
好!现在我们这样来看A这个类,A类中其实是这样的!
一个私有的变量aa,两个方法set_Aa(String)和get_Aa(),没问题哦(嘿嘿,老衲此处冷笑一下),如果试图在A类中添加这两个方法在VS08中是会出错的哦!
Like this!
class A { public void Display() { Console.Write("aa"); } private string aa = "aa"; public string Aa { get { return aa; } set { aa = value; } } public void set_Aa(string a) { aa = a; } public string get_Aa() { return aa; } }
Vs 将告诉你,你犯下了如下错误:
C#中诡异的属性生活中的诡异事件
为了避免这样的错误,建议看看C#的代码规范,最好不要出现set_XXX(type t)和get_XXX()这样的函数,如果有这样的需求,建议使用属性!
。。。。。。
某年某月某日,寺内小沙弥觉得B类不强大,改装之,不过呢,B类是这样写的!
class B:A { public void Display() { Console.Write("bb"); } public string bb; public void set_Aa(string a) { bb = a; } public string get_Aa() { return bb; } }
是不是觉得好熟悉啊!为什么B类有两个方法,set_Aa(String)和get_Aa(),感觉到这么的诡异呢!
好了,客户端代码来了!
如下:
class Program { static void Main(string[] args) { B b = new B(); b.Aa = "bb"; Console.WriteLine(b.bb); Console.WriteLine(b.Aa); Console.ReadKey(); } }
亲,用你对OO的理解告诉我,运行的结果是什么?
如果你的计算的结果是这样的,老衲觉得你还没被老衲忽悠住,如果不是,哈哈,你被老衲忽悠了!
C#中诡异的属性生活中的诡异事件
为什么b.bb没有输出呢?如果施主你没有算到是这样的结果,请留言告知老衲!
如果你觉得应该在两个函数前加上new,你懂关键字,但是你不动编译,不信你可以试试哦!
好了!你是不是在怀疑是不是B类的方法没有执行,对了!你不用怀疑,就是这样,不过为什么会这样?
。。。。。。。。
如果你觉得奇怪的话,如果A是这样:
class A { public void Display() { Console.Write("aa"); } private string aa = "aa"; public string Aa { get { return aa; } set { aa = value; } } public void set_Bb(string a) { aa = a; } public string get_Bb() { return aa; } }
B呢,这样的:
class B:A { public void Display() { Console.Write("bb"); } public string bb; public string Bb { get { return bb; } set { bb = value; } } public void set_Aa(string a) { bb = a; } public string get_Aa() { return bb; } }
客户端是这样的:
class Program { static void Main(string[] args) { B b = new B(); b.Aa = "set aa"; b.Bb = "set bb"; Console.WriteLine(b.bb); Console.WriteLine(b.Aa); Console.ReadKey(); } }
结果是什么呢?
是这样的结果:
C#中诡异的属性生活中的诡异事件
施主,你的理解对么?

Tags: 

延伸阅读

最新评论

发表评论