· 代碼段。這個功能很早就知道了,Framework已經提供了很多代碼段,我們也可以自定義代碼段,不過之前一直沒有用過,今天實踐了一下,還是挺有意思的,這種代碼自動生成的思想其實挺有用的。另外發現一點,Framework中提供的代碼段中,關於C#和VB的數量明顯不一樣,不知道為啥C#要少呢?上網查了
· 代碼段。這個功能很早就知道了,Framework已經提供了很多代碼段,我們也可以自定義代碼段,不過之前一直沒有用過,今天實踐了一下,還是挺有意思的,這種代碼自動生成的思想其實挺有用的。另外發現一點,Framework中提供的代碼段中,關於C#和VB的數量明顯不一樣,不知道為啥C#要少呢?上網查了一下,說MSDN中提供了對C#代碼段的擴展,可以下載下來試驗一下。
· 重構。之前通過IDE進行重構時,一直是在Eclipse中用,感覺非常方便。現在VS2005也加上這個功能了,感受了一下,和Eclipse差不多,一個比較好的地方是通過VS2005進行重構時,可以對同一個解決方案中不同的項目保持同步,這一點非常有用。
· 調試。VS2005可以支持Debug時對代碼進行修改,這個特性已經用得非常頻繁了。
· 可空類型。對於布爾類型,可以給他指定ture或false。請看如下代碼
public void test() { int? i = null; int? y = 4; int? x = i + y; Console.Write(x);//x為null }
· 空合併運算符。空合併運算符提供了一種快捷的表達方式,可以在處理可空類型和引用類型時表示null可能的值。
1). 如果第一個操作數不是null,那麼整個表達式等於第一個操作數的值。
2).如果第一個操作數是null,那麼整個表達式就等於第二個操作數的值。
int? a=null int b; b=a??10;//b=10; a=3; b=a??10//b=2;
如果第二個操作數不能隱含的轉換為第一個操作數的類型,就會生成一個編譯錯誤。
匿名類型
public object test() { return new { a="1",b="2"}; } dynamic dy = new ExpandoObject(); dy = test(); Response.Write(dy.b);
哈,dynamic類型2.0可沒有。這裡先借用著。
部分類(partial class)
這個沒啥可說的,就是把一個類拆開為兩個類而已,但是類名就得相同了。常見於.net的控制項初始化都寫到了部分類裡邊。
public partial class test { /// <summary> /// Head1 控制項。 /// </summary> /// <remarks> /// 自動生成的欄位。 /// 若要進行修改,請將欄位聲明從設計器文件移到代碼隱藏文件。 /// </remarks> protected global::System.Web.UI.HtmlControls.HtmlHead Head1;//這行 }
將這行代碼貼到.cs文件中,程式也將是一樣運行。
FrameWork3.5特性
3.5的特性在日常工作中,有意/無意的也使用的比較多了。下麵一一羅列
這是我在找版本特性時候找到的一個鏈接http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx。
裡邊介紹了3.5版本的新特性。
.LINQ
略,這個討論的人太多了。到處都是
· Lambda
自C#3.0開始,就可以使用一種新語法把實現代碼賦予委托:Lambda表達式。
只要有委托參數類型的地方,就可以使用Lambda表達式。
Lambda運算符"=>"的左邊列出了需要的參數。Lambda運算符的右邊定義了賦予Lambda變數的方法的實現代碼.
public delegate string thisAction(string par); static void Main(string[] args) { thisAction lambda = a => {return a += "this is my test";}; //此處可以理解為使用了匿名函數? //一般而言,應該 為 thisAction lambda=functionName。 string aa = lambda("Hi, "); Console.Write(aa); }
下麵這種:
public delegate string thisAction(string par); static void Main(string[] args) { // thisAction lambda = a => {return a += "this is my test";}; thisAction lambda=functionName; string aa = lambda("Hi, "); Console.Write(aa); } static string functionName(string par) { return par += "this is my test"; }
應該是這樣吧,手敲的沒有去測試呢。
只不過一個是把邏輯放到了Lambda中,一個用方法封裝了下,然後直接將方法名賦給委托。哦,對了,哪個註釋的地方,應該不是匿名函數了。只是lambda支持的一種寫法而已。
所以從上面也可以看到很多人都採用第一種方法,把邏輯寫到lambda中,而沒有將該邏輯封裝到一個方法中,然後調用方法名。 捋清思路就好看別人寫的代碼了。
(其實我一直理解是lambda是用在集合的地方。但是總是喜歡混淆。)
· Var 隱含類型變數
類型推斷,編譯器根據變數的初始值來“推斷”變數的類型。
需要遵循的規則:
1)變數必須初始化。否則,編譯器沒有推斷變數類型的依據。
2)初始化器不能為空。
3)初始化器必須房在表達式前。
4)不能把初始化器設置為一個對象,除非在初始化器中創建了一個新的對象。
· 自動屬性,對象初始化器和集合初始值
以前:
private int property; public int Property { get { return property; } set { property= value; } }
現在可以簡寫了:
public int Property { get; set; } //(註:快速便捷方式 prop(propfull..)+Tab鍵+Tab鍵)
對象初始化:
UserInfo model = new UserInfo { id = Person.id, name =Person.name, age =Person.age };
(Person.Id是下麵的匿名類型)
集合初始化:
List<UserInfo> list = new List<UserInfo> { new UserInfo{age=1,name="Name",id=1}, new UserInfo{age=2,name="Name",id=2}, };
· 擴展方法(Extension Method)
這個特性使用得好的話,能省很多代碼。
定義:擴展方法,它允許改變一個類,但不需要該類的源代碼。擴展方法是靜態的,他是類的一部分,但實際上沒有放在類的源代碼中。(更多參考:http://www.cnblogs.com/ldp615/archive/2009/08/07/1541404.html )
Eg:
public static class Extention { public static MvcHtmlString WriteHtml(this HtmlHelper htmlHelpder, string html) { return new MvcHtmlString(html); } public static string toJsons(this object o) { JavaScriptSerializer serializer = new JavaScriptSerializer(); return serializer.Serialize(o); } }
調用:
var model = list[0]; string jsonStr = model.toJson(); //調用的擴展方法toJson()
結果:
{"id":1,"name":"Name","age":1}
註意:
1).如果擴展方法與該類型中定義的方法具有相同的簽名,則擴展方法永遠不會被調用。
2).擴展方法被在命名空間級別放入範圍中。例如,如果您在同一個名為 Extensions 的命名空間中具有多個包含擴展方法的靜態類,則這些擴展方法將全部由 using Extensions; 指令放入範圍中。
總結:和普通的靜態方法有何差別。在這個方法的第一個參數前面多了一個this關鍵字。擴展方法:
1).方法所在的類必須是靜態的
2).方法也必須是靜態的
3).方法的第一個參數必須是你要擴展的那個類型,比如你要給int擴展一個方法,那麼第一個參數就必須是int。
4).在第一個參數前面還需要有一個this關鍵字。
匿名類型
Var關鍵字,用於表示隱式類型化的變數,var和new關鍵字一起使用時候,可以創建匿名類型。匿名類型只是一個繼承自Object且沒有名稱的類。該類的定義從初始化中推斷,類似於隱式類型化的變數。
Eg:
var Person = new { id = 1, name = "yourName", age = 22 }; UserInfo model = new UserInfo { id = Person.id, name =Person.name, age =Person.age };
(註意區分,匿名類型下與對象初始化賦值的區別)
· ASP.NET AJAX
略。
樓主吐槽下,8月份來的新公司,這公司項目也有價值吧,算是個電商企業(旅游塊)的,可是項目裡邊全屏控制項,超級無敵難維護,樓主幾乎沒用過控制項寫代碼好反感啊,而且那個控制項ajax 看不懂啊.. 編譯項目各種報錯.
FrameWork4.0特性
4.0伴隨著mvc的火熱,很多精品的內容,但是樓主沒環境享受,扼腕嘆息下。
推薦下參閱地址http://www.cnblogs.com/webabcd/archive/2010/06/29/1767212.html
上公司中樓主常用的特性列舉下。
· 動態類型
創建自己的動態對象有兩種方法:
1)從DynamicObject中派生。
2)使用ExpandoObject。使用DynamicObject需要做的工作比較多,因為必須重寫幾個方法,而ExpandoObject是一個可立即使用的密封類。
dynamic dyPerson = new ExpandoObject();//創建一個動態對象。
動態類型有兩個限制。動態對象不支持擴展方法,匿名函數(lmabda表達式)也不能用做動態方法調用的參數
· 可選參數和命名參數
/* * 命名參數和可選參數 * 命名參數:調用方法時,可以不按位置傳遞參數,而是指定參數的命名來傳值 * 可選參數:聲明方法中的參數時,可以為其設置預設值,那麼在調用該方法時,這種可選參數是可以忽略的 */
可以參考mvc3中,預設的路由中看到有使用。
eg:
public void FunctionNamedParam(int x, int y , int z=1)
在函數調用將是:
FunctionNamedParam(x:1, z:3, y:2); FunctionNamedParam(y:1, x:3);
ok,完結了。這些東西都是樓主邊工作邊學習邊自己總結的,拿出來有些寒磣,不過畢竟是自己一點點積累的。當然有缺漏的,也懇請大家補充,相互交流。