事先聲明,本文代碼是在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!
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#的代碼規范,最好不要出現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的理解告訴我,運行的結果是什麼?
如果你的計算的結果是這樣的,我覺得你還沒被我忽悠住,如果不是,哈哈,你被我忽悠了!
為什麼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();
}
}
結果是什麼呢?
是這樣的結果:
作者“老衲愛封裝”