日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Net学习日记_ASP.Net_MVC_新语法笔记

發布時間:2025/3/15 asp.net 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Net学习日记_ASP.Net_MVC_新语法笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

01.新語法

本章中主要講解.Net框架性語法。開發者可以使用新語法提高編程的效率以及代碼的運行效率;其本質都是“語法糖”,由編譯器在編譯時轉成原始語法。

1 自動屬性 Auto-Implemented Properties

2? 隱式類型 var

3? 對象初始化器 與 集合初始化器 { }

4? 匿名類 & 匿名方法

5? 擴展方法

6? 系統內置委托 Func / Action? Predicate (bool (T)) / Comparison (int (T,T))

7? Lambda表達式

8? 標準查詢運算符 Standard query operator

9? LINQ查詢表達式

?

Mvc框架簡介:

瀏覽器請求 服務器的 某個控制器類 的 Action方法,方法中可以調用業務層等代碼處理業務,并產生數據Model,交給視圖引擎,視圖引擎會找到對應視圖,并將數據 “填充到“視圖上對應的位置,最終產生整個頁面的Html代碼,返回給瀏覽器。

?

關于編譯器:

編譯器會在編譯的時候,按照C#語法檢查代碼,C#語法規定變量只能調用其聲明類型的成員,如果聲明是父類,則只能調用對象里的父類成員

自動屬性

回顧傳統屬性概念

屬性的目的:封裝字段,控制 1.讀寫權限 及 2.字段的訪問規則(如:年齡范圍)。

但平時,主要是用來封裝 讀寫權限。

?

回顧 語法:缺點,臃腫,代碼難看!麻煩!

int id; //字段 public int Id //屬性 {get { return id; }set { id = value; } }

自動屬性 語法:只需要定義 無實現的屬性語法 即可,不需要定義字段。

public int Id { get; set; } public int Age { get; set; } public string Name { get; set; }

查看源碼:

編譯后,也生成了對應的屬性語法(get和set方法)

但同時,幫我們生成了一個私有變量

總結:

自動屬性主要用在對 字段的 讀寫權限的封裝,幫助減少程序員代碼,讓代碼更好看;但實質上在編譯時,還是會自動生成一個對應的字段的。

所以,從這個意義上說,自動屬性就相當于是微軟提供的一個“語法糖”了。

?

思考:

用自動屬性程序員寫的代碼少了,機器做的事情就多了,那我們到底要不要使用它?

如果 是針對 讀寫權限的封裝,就推薦使用,因為它是在編譯的時候產生了負擔,并不是在運行的時候。(不會影響客戶運行程序時的效率!)

但是編譯生成的代碼也有一個顯而易見的缺點,語法太完整,編譯后的程序集會比較大。

?

隱式類型var

回顧,傳統變量定義方式:

int age = 11;//傳統方式

?

?隱式類型:在初始化時,就已經根據 = 右邊的 值 確定了 var變量的類型了。

var age1 =12; //age1="123"; var name = "哈哈哈"; var dog = new Dog();age1 = 123; name = "劉德華"; dog.Id = 11;

編譯時,已經 把var 轉成了 相應的類型了。

注意:

1.聲明的同時必須初始化,因為編譯時要根據初始化值類型來推斷var;

2.聲明后不能修改數據類型,因為初始化時已經確定了var類型了;

3.只能作為方法局部變量使用。類的成員字段、方法的形參和返回值都不能使用!因為無法編譯時確定他們的類型!

4.初始化表達式不能是匿名函數和null。

?

查看源碼:var 已經不存在了,都被替換成了 初始化值 的 類型。

?

對象/集合初始化器

List<Dog> InitList() {List<Dog> list = new List<Dog>();for (int i = 0; i < 10; i++){Dog d = new Dog();d.Id = i;d.Name = "Ruiky" + i;d.Age = i * 2;d.Toy = new DogToy();d.Toy.ToyId = i;d.Toy.ToyName = "狗狗玩具" + i;list.Add(d);}return list; }

對象集合初始化器語法:

用法1List<Dog> InitList(){List<Dog> list = new List<Dog>();for (int i = 0; i < 10; i++){Dog d = new Dog{Id = i,Name = "Ruiky" + i,Age = i * 2,Toy = new DogToy()//使用屬性初始化器 {ToyId = i,ToyName = "狗狗玩具" + i}};list.Add(d);}return list;}//用法2List<Dog> InitList(){List<Dog> list = new List<Dog>{new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = { ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = { ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = { ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = { ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = { ToyId=1, ToyName="小球"}}};return list;}

用初始化器,創建數組!

Dog[] dogs = {new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = new DogToy{ ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = new DogToy{ ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = new DogToy{ ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = new DogToy{ ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = new DogToy{ ToyId=1, ToyName="小球"}} };

?

查看源碼:可以看到,編譯器幫我們實例化的集合或者數組,并創建了元素對象,設置給數組或集合。

?

匿名類

回顧:

匿名類語法:

? a.避免過度的數據累積
? b.為一種情況特別進行的數據封裝
? c.避免進行單調重復的編碼

var obj = new{Id = 1,Name = "Ruiky",Age = 2};

?

查看源碼:

1.編譯器自動為 這個 【匿名類】 創建了一個無命名空間的類型。

2.在new 關鍵字處,創建該匿名類對象

3.編譯器創建的匿名類結構

?

注意:

1. 當出現“相同”的匿名類的時候,編譯器只會創建一個匿名類

2. 編譯器如何區分匿名類是否相同?

?? 根據:

? ? ? ? ? 屬性名,屬性值(因為這些屬性是根據值來確定類型的),

? ? ? ? ? 屬性個數,屬性的順序。

?

匿名方法

回顧:普通方法定義方式,因為方法的存在是為了 復用 一段代碼,所以一般會給方法取個名字,這個方法的引用就可以通過 "方法名"調用。

void Test(){Console.WriteLine("哈哈哈~!");}

?

匿名方法:但是有的方法,不需要復用,僅僅是使用一次就夠了,所以不需要方法名,這種方法就叫做匿名方法。

匿名方法必須結合 委托 使用。(潛在的意思就是:盡管沒有方法名了,但方法的指針還是存放在了某個委托對象中)

如,現在為線程指定要執行的方法的時候,就可以使用匿名方法了。

注意:

1.在編譯后,會為每個匿名方法創建一個 私有的靜態方法,然后將此靜態方法傳給 委托對象使用。

?

擴展方法

為什么要有擴展方法?? ? ? 就是為了在不修改源碼的情況下,為某個類 增加新的方法。

語法:

定義靜態類,并添加public的靜態方法,第一個參數 代表 擴展方法的擴展類。

a)?????? 它必須放在一個非嵌套、非泛型的靜態類中(的靜態方法);

b)?????? 它至少有一個參數;

c)?????? 第一個參數必須附加 this 關鍵字;

d)?????? 第一個參數不能有任何其他修飾符(out/ref)

e)?????? 第一個參數不能是指針類型

?

public static class DogExtention{public static string SayHi(this Dog dogObj){return string.Format("哈哈哈哈~~~我叫{0}!", dogObj.Name);} } //----------------------- //使用擴展方法 Dog d = new Dog() { Id = 1, Name = "0094", Age = 11, Toy = new DogToy() { ToyId=1, ToyName="小骨頭" } }; string str = d.SayHi();//調用擴展方法,此時的對象d就作為第一個參數傳到了擴展方法中 編譯后: string str = DogExtention.SayHi(d);

?

注意:

1.當我們把擴展方法定義到其它程序集中時,一定要注意調用 擴展方法的環境中包含 擴展方法所在的命名空間。如,在Extention下為String類添加一個擴展方法

然后在頁面中使用時,要記得導入命名空間,否則調用不到擴展方法:

2.擴展方法需要使用特性ExtensionAttribute,當前程序中必須包含程序集ComplilerServices,否則報錯如下:

注:此程序集默認在FrameWork3.5開始自動包含。

3.因為擴展方法的本質是被編譯后替換成靜態方法,所以 對象本身 可以為 null,但是在這個擴展方法中,如果訪問了第一個參數,則會報“空指針異常”。

查看源碼:

1.通過源碼看到,在執行 string str = d.SayHi();的地方,編譯后變成了 這個擴展方法通過靜態類的調用方式代碼。由此可見,擴展方法并沒有被"擴展"到Dog類中,只不過是在編譯的時候替換成了靜態類里的靜態方法而已。d.SayHi()就是一個語法糖!

思考:如果 Dog類中本身就包含 SayHi方法,那會怎么樣?

但同時包含同名的 實例方法 和 擴展方法時,優先調用實例方法。

?

泛型委托

?回顧通過【比較接口】方式:

讓 Dog集合 根據Dog的id排序,需要寫一個IComparer<Dog>接口的實現類,在類中重寫 接口的 Compare方法,來返回 正整數/0/負整數。

接口:

實現類(比較器):

然后將實現類對象傳入集合的Sort方法:

使用泛型委托 + 匿名方法實現:

List<T>集合類中包含 新的排序方法,根據 泛型委托Comparison<T> 完成比較過程。

public void Sort(Comparison<T> comparison);

看看這個Comparison<T> 泛型委托:

public delegate int Comparison<in T>(T x, T y);

修改調用的方法:

常用系統泛型委托:

1.System.Func 代表有返回類型的委托 public delegate TResult Func<out TResult>(); public delegate TResult Func<in T, out TResult>(T arg); ...... 注:輸入泛型參數-in 最多16個,輸出泛型參數 -out 只有一個。 2.System.Action 代表無返回類型的委托 //list.ForEach public delegate void Action<in T>(T obj); public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2); ...... 注:參數最多16個 3.System.Predicate<T> 代表返回bool類型的委托 //list.Find public delegate bool Predicate<in T>(T obj); 4.System.Comparison<T> 代表返回int類型的委托 - 用作比較兩個參數的大小 public delegate int Comparison<in T>(T x, T y); //list.Sort

?

關于泛型委托的泛型參數列表 in out

//泛型委托 的 in 泛型參數 代表 可以被作為 參數列表的類型 // out 泛型參數 代表 可以被作為 返回值的類型 public delegate T2 DgSay<in T,out T2>(T t1);

?

?

Lambda表達式

回顧,發現上面的代碼,需要傳一個 匿名方法 ,寫起來特別別扭。

能否有簡化的語法呢?有!Lambda表達式。

概念:

Lambda表達式有兩種:

語法:

List<Dog> list = InitList(); //list.FindAll(delegate(Dog d) { return d.Id > 2; }); //1.表達式 Lambda list.FindAll(d => d.Id > 2);// goes to list.ForEach(d => Response.Write(d.ToString() + "<br/>"));//2.語句 Lambda list.ForEach(d => { if (d.Id > 2) Response.Write(d.ToString() + "<br/>"); });

語法進化史:

查看源碼:

C#語法:list.FindAll(d => d.Id > 2);

編譯成中間代碼后,代碼太多,簡而言之如下:

編譯器幫我們 :

1.聲明一個 Predicate<Dog>委托變量;

2.創建一個私有的符合委托簽名的靜態方法;

3.實例化委托變量,并將方法 傳入;

4.調用list.FindAll方法,并傳入委托變量。

?

轉載于:https://www.cnblogs.com/lisong-home/p/8207086.html

總結

以上是生活随笔為你收集整理的Net学习日记_ASP.Net_MVC_新语法笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。