走進c#
本週專案逐漸完工,沒有發現什麼重大問題,所以一直在寫.net的實驗,.net框架大部分使用的是以c#編寫的,上課的時候也仔細聽了一下,也算對c#有些瞭解,之前先學的java,對比java,感覺c#有其他的特性(也可能java也有,只是我不熟悉),在這裡總結一下(本文只是個人的理解,如有錯誤,希望能指出並原諒,僅是初學).
1.屬性和欄位
之前我一直以為屬性和欄位是同一個意思,但其實不是這樣的,欄位通常是在類中定義的類成員變數,而屬性是對欄位的封裝,供外部訪問。這在java中就是像getXX(),setXX()的方法一樣.
例如:
//java中 class Person { Stringname;// 欄位(類成員) public void setName(String name) {//name的寫屬性 this.name = name; } public String getName() {//name的讀屬性 return this.name; } }
c#的屬性寫法類似type.js的:
class Person{ string name; public string Name{ get{ return name; } set{ name = value; } } }
這裡屬性的定義就是: [修飾符] 型別說明符 Name,就是上面第三行,此時name就是欄位,Name就是屬性了,這個屬性是公有的可直接獲取,但是獲取和賦值都在我們的控制中,也可以去掉get或set將欄位設定為只可讀或只可設定.
2.多型
在c#中,實現多型重寫父類方法是,只能重寫虛方法,需要使用到關鍵詞virtual.
例如:
class Program { static void Main(string[] args) { Father father = new Child(); father.sayName(); } } class Father { public void sayName() { Console.WriteLine("fathler"); } } class Child : Father { public void sayName() { Console.WriteLine("child"); } }
定義一個父類和子類,在入口函式Main中新建一個子類賦值給父類,根據多型的含義,在java中肯定直接輸出child了,但是c#中卻直接輸出了father:
原因就是因為要覆蓋父類中的方法,父類方法必須要用virtual修飾,子類方法要用override修飾,而java中預設所有的方法都是虛方法,所以java就直接輸出child的.
class Program { static void Main(string[] args) { Father father = new Child(); father.sayName(); } } class Father { public virtual void sayName() { Console.WriteLine("fathler"); } } class Child : Father { public override void sayName() { Console.WriteLine("child"); } }
這麼想來之前c++也見過virtual這個關鍵字,解決了多繼承的問題,但是當時沒看明白,果然還是用過才能理解。
3.結構體
結構體與類類似,就是類是放在堆中的,結構體放在棧中,優點就是建立快,缺點就是不能全域性引用。
// 寫法與類類似,就是將class改為struct 也可繼承 實現介面
public struct {
string title; public stringgettitle() { return title; }
}
總結
我感覺c#就像是c++的改進版,更加的面向物件,同時還吸取了java,js等其他語言的特點融合起來的,感覺就是現在的各種語言都有很多相似的地方,大家互相借鑑學習並融合,變得越來越強大了,同時學好一門語言學其他的壓力也就沒這麼大了,不像剛開始的學c語言那麼費勁了.