c# 3.5 新特性的總結:
一、物件初始化
如果乙個類有public欄位,在建立類的物件例項時可以使用下面的**來初始化這些字段;
public class myclass
myclass my = new myclass();
my.field1 = 「abcd」;
my.field2 = 44;
my.field3 = true;
在c#3.0中提供了一種更簡便的方法來初始化這些public變數,**如下:
myclass my = new myclass
;二、集合初始化
在c#3.0中還改進了對集合類的初始化方式(使其初始化的方式類似於陣列)。但遺憾的是,這種初始化方式只支援用泛型的集合類**如下:
listpeople = new list,
new person ,
new person
}; 三、用var定義變數
在c#3.0中提供了一種新的宣告變數的方式,這就是var。通過這個關鍵字,在宣告變數時就無需指定型別了,變數型別是在初始化時由編譯器確定的。**如下:
var ss = "abcd";
messagebox.show(ss.gettype().tostring());
上面的**將顯示system.string,從而證明c#編譯器已經將ss編譯成了string變數了。而在輸出ss後,再輸入「.」後,會看到將string型別變數的相應方法和屬性也列出來了,因此可以斷定,c#將ss看成了string型別,而不是object。所以使用var定義變數同時可以擁有object和強型別的優點。
在使用var定義變數時有以下四個特點:
1. 必須在定義時初始化。也就是必須是var s = 「abcd」形式,而不能是如下形式:
var s;
s = 「abcd」;
2. 一但初始化完成,就不能再給變數賦與初始化值型別不同的值了。
3. var要求是區域性變數。
4. 使用var定義變數和object不同,它在效率上和使用強型別方式定義變數完全一樣。但筆者建議如果事先知道變數的型別,盡量使用強型別方式來宣告變數。否則,就會造成由於大量使用var,而使得開發人員很難斷定某個變數是什麼型別。這樣不利於程式的維護和公升級。
雖然var有利有弊,但筆者個人認為,如果將動態語言轉換成c#語言,可以考慮使用var來定義變數。這是因為動態語言沒有型別,而要將其轉換成強型別的c#語言,就必須給變數指定個型別,但事先確定型別是很費勁的,不如將其指定成var,再由c#編譯器去確定變數的具體型別。那麼如果在轉換的過程中,發現動態語言的變數改變了型別,該怎麼辦呢?這個可以使用第三部分要講的「匿名類」來解決這個問題。
四、匿名類
在c#3.0中提供了一種新的建立類的方法,**如下:
var my = new
;messagebox.show(my.field1);
c#編譯器會自動推斷my是乙個有兩個public欄位的類的物件例項。也就是說相當於下面的**:
public class myclass
var my = new myclass();
my.field1 = "abcd";
my.field2 = 25;
messagebox.show(my.field1);
五、擴充套件方法
這個世界上總是存在著很多奇妙的東西。然而,在這部分所介紹的擴充套件方法就是其中之一。從字面上看可能讀者很難猜透「擴充套件方法」是什麼意思。然而,看了下面的例子,就會感覺到非常的奇妙。
namespace extmethod
public class class2 : class1
public static class anyclassname
}public partial class form1 : form}}
看到上面的**,也許很多人會感到奇怪,在class1和class2中並沒有getname方法,怎麼在呼叫時出來個getname方法呢?實際上,這就是擴充套件方法的用法,從本質上說,擴充套件方法就是將靜態方法(必須宣告成static)插入到某個類和其子類中(也就是說,在這些類中可以使用在外部定義的靜態方法)。那麼要往哪個類中插入呢?這就要在定義靜態方法時指定了。大家可以看看getname方法的第乙個引數,使用了this關鍵字,這就表明這個方法是乙個擴充套件方法,後面的型別就是要插入該方法的類,在本例中是class1,也就是說在class1及其子類中都可以使用getname方法。上面的呼叫**也相當於下面的**:
class2 c = new class2();
messagebox.show(anyclassname.getname(c));
但使用c.getname可能會更好一些,而且也降低了對靜態方法所在的類(anyclassname)的依賴性。
在使用擴充套件方法時應注意以下幾點:
1. 擴充套件方法所在的類名可以是任意合法的類名。
2. 擴充套件方法所在的類必須和使用擴充套件方法的**在同乙個命名空間裡,否則無法編譯通過。
3. 在本例中,class1和class2只能宣告成public,因為anyclassname被宣告為public。如果anyclassname不加修飾符,class1和class2也可以不加修飾符,當然,也可以被宣告為public。也就是說,class1和class2必須有比anyclassname具有更強的訪問性。如下面**所示:
class class1
class class2 : class1
static class anyclassname // 這時如果前面加public是無法編譯通過的。
}4. 如果在class1或class2中已經有getname方法了,那麼class1或class2中的getname優先順序更高。也就是說,擴充套件方法是無法覆蓋原類中的同名(引數名和型別也相同)的方法的。
擴充套件方法尤其在很多類需要同樣的方法,而這些類又無法繼承其它類時特別有用。當然,在要對某個類進行擴充套件,但我們並沒有源**時,擴充套件方法也可以派上用場。
六、自動屬性
自動屬性允許你避免手工宣告乙個私有成員變數以及編寫get/set邏輯,取而代之的是,編譯器會自動為你生成乙個私有變數和預設的get/set 操作。
譬如,使用自動屬性,我現在可以將上面的**改寫成:
public class person
public string lastname
public int age
}
C 3 5 新特性的總結 一
c 3.5 新特性的總結 一 物件初始化 如果乙個類有public欄位,在建立類的物件例項時可以使用下面的 來初始化這些字段 public class myclass myclass my new myclass my.field1 abcd my.field2 44 my.field3 true ...
C C 2 0新特性與C 3 5新特性
c 2.0新特性與c 3.5新特性 一 c 2.0 新特性 1 泛型 listobj list new list obj list.add new myobject 2 部分類 partial namespace set 或在另乙個檔案中 public partial class class1 3 ...
從C 2 0新特性到C 3 5新特性
一 c 2.0 新特性 1 泛型 listobj list new list obj list.add new myobject 2 部分類 partial namespace set 或在另乙個檔案中 public partial class class1 3 靜態類 public static ...