一、泛型html
public class List<T>{jquery
}程序員
當定義泛型類的實例時,必須指定這個實例所存儲的實際類型,泛型容許程序員將一個實際的數據類型規約延遲至泛型的實例被建立時才肯定,泛型主要有兩個有點:ajax
1)編譯時能夠保證類型安全數據庫
2)不用作類型裝換,得到必定的性能提高。express
二、泛型方法、泛型委託、泛型接口編程
//泛型委託c#
public delegate void Del<T>(T item);數組
public static void Notify(int i){}瀏覽器
//泛型接口
public class myClass<T1,T2,T3>:MyInteface<T1,T2,T3>{
public T1 Method1(T2 param1,T3 param2){
throw new NotImplementedException();}}
interface MyInteface<T1,T2,T3>{
T1 Method1(T2 param1,T3 param2);
}
//泛型方法
static void Swap<T>(ref T t1,ref T t2){
T temp=t1;
t1=t2;
t2=temp;
}
public void Interactive(){
string str1="a";
string str2="b";
Swap<string> (ref str1,ref str2);
Console.WriteLine(str1+","+str2);
}
三、泛型約束 (能夠給泛型的類型參數上加約束)
Where T:struct --類型參數虛是值類型
Where T:class --類型參數需是引用類型
Where T:new() --類型參數要有一個public的無參構造函數
............
四、部分類(partial)
在聲明一個類、結構或者接口的時候用partial關鍵字可讓源碼分佈在不一樣的文件中。部分類僅是編譯器提供的功能,在編譯的時候會把partial關鍵字定義的類合在一塊兒編譯。
五、匿名方法
匿名方法的本質其實就是委託,函數式編程的最大特色之一就是把方法做爲參數和返回值。ConsoleWrite——>MulticastDelegate(intPtr[ ])——>Delegate(object,intPtr)匿名方法:bian編譯後會生成委託對象,生成方法,而後把方法裝入委託對象,最後賦值給聲明的委託變量。匿名方法能夠省略參數:編譯的時候會自動爲這個方法按照委託簽名的參數添加參數
public delegate void ConsoleWrite(string strMsg);
ConsoleWrite delCWl=new ConsoleWrite(WriteMsg);
delCWl("天下第一");
ConsoleWrite delCw2=delegate(string strMsg){
Console.WriteLine(strMsg);
}
DelCW2("天下第二");
隱式推斷類型Var
應用場合:var主要用於表示一個LINQ查詢的結果。這個結果既多是ObjectQuery<>或IQueryable<>類型的對象,也多是一個簡單的實體類型的對象或者是一個基本類型對象,這時使用var聲明這個對象能夠節省不少代碼書寫上的時間
var customer=new User();
var i=1;
var隱式類型的限制
被聲明的變量必須是一個局部變量,而不是靜態或實例字段
變量必須在聲明的同時被初始化,由於編譯器要根據初始化值推斷類型
初始化的對象不能是一個匿名函數
初始化表達式不能是null
語句中只聲明一次變量,聲明後不能更改類型。
複製的數據類型必須是能夠在編譯時肯定的類型
對象集合初始化器
對象初始化:
.NET3.5/C#3.0 中咱們有一種更好的方式來進行對象的初始化,那就是使用對象初始化器。這個特性時匿名類的一個基礎
User user=new User{Id=1,Name="強哥",Age=23};
集合初始化:
list<Dog>dogs=new List<Dog>(){new Dog(){Name="Tom",Age=1},new Dog(){Name="Lucy",Age=3}}
6.匿名類
匿名類型提供了一種方便的方法,可用來將一組只讀屬性封裝到單個對象中,而無須首先顯式定義一個類型。類型名由編譯器生成,而且不能在源代碼級使用,每一個屬性的類型由編譯器推斷。咱們可使用new{object initializer} 或new[ ]{object,......}來初始化一個匿名類或不肯定類型的數組。匿名類的對象須要使用var關鍵字聲明。
var p=new {Id=1,Name="zouqj",Age=27};//屬性名字和順序不一樣會生成不一樣類
在編譯後會生成一個"泛型類",
直接使用select new{object initializer}這樣的語句就是將一個LINQ查詢的結果返回到一個匿名類中
系統內置委託
Func/Action委託使用可變性:
Action<object>test=delegate(object o){Console.WriteLine(o);};
Action<string>test2=test;
Func<string>fest=delegate(){return Console.ReadLine();};
fest2=fest;
public delegate void Action();
public delegate bool Predicate<in T>(T obj);
public delegate int Comparison<in T>(T x,T y)
協變指的是委託方法的返回值類型直接或間接繼承自委託簽名的返回值類型,逆變則是參數類型繼承自委託方法的參數System.Func,表明又返回類型的委託
public delegate TResult Func<out TResult>();
public delegate TResult Func<in T,out TResult>(T arg)
注:輸入泛型參數-in最多能夠有16個,輸出泛型參數-out只有一個。System.Action表明無返回類型的委託
public delegate void Action<in T>(T obj);
public delegate void Action<in T1,in T2>(T1 arg1,T2 arg2);
注:最多有16個參數,System.Predicate<T>表明返回bool類型的委託,用做執行表達式
public delegate bool Predicate<in T>(T obj)
System.Comparison<T>表明返回int類型的委託,用於比較兩個參數的大小。爲何要定義這麼多簡單的委託?
public delegate int Comparison<in T>(T x,T y)
七、Lambda表達式
Lambda表達式的本質就是匿名函數,Lambda表達式基於數學中的「入」演算得名,直接對應於其中的lambda抽象,是一個匿名函數,既沒有函數名的函數。Lambda表達式是一個匿名函數,能夠包含表達式和語句,而且可用於建立委託或表達式樹類型。
lambda的基本形式是:
(input parameters) => expression
只有在Lambda有一個輸入參數時,括號纔是可選的,不然括號是必需的。兩個或更多輸入參數由括在括號中的逗號分隔:(x,y)=>x==y。
有時,編譯器難於或沒法推斷輸入類型。若是出現這種狀況,您能夠按如下示例中所示的方式顯示指定類型:
(int x,string s)=> s.Length>x
使用空括號指定零個輸入參數:
()=>someMethod()
Lambda表達式縮寫推演
new Func<string,int>(delegate(string str){return str.Length})
delegate(string str){return str.Length;}//匿名方法
(string str)=>{return str.Length;}//Lambda語句
(string str)=>str.Length//Lambda表達式
(str)=>str.Length//讓編譯器推斷參數類型
str=>str.Length//去掉沒必要要的括號
九、標準查詢運算符(SQO)
標準查詢運算符是定義在System.Linq.Enumerable類中的50多個爲IEnumerable<T>準備的擴展方法,換句話說IEnumerable<T>上的每一個方法都是一個標準查詢運算符,這些方法用來對操做集合進行查詢篩選
標準查詢運算符提供了包括篩選、投影、聚合、排序等功能在內的查詢功能。
1)、篩選集合Where
where方法提供了咱們對於一個集合的篩選功能,但須要提供一個帶bool返回值的「篩選器」(匿名方法、委託、Lambda表達式都可),從而代表集合中某個元素是否應該被返回。
var lst=InitLstData();
var result=lst.Where(x=>x.Age>=30).toList();
result.ForEach()
2)、查詢投射Select
返回新對象集合IEnumberable<TSource>Select().返回年齡大於等於30歲的人的名字,代碼以下:
var result=lst.Where(x=>x.Age>=30).Select(s=>s.Name).toList();
result.ForEach(x=>Console.WriteLine(x))
3)、統計數量int Count()
lst.Where(x=>x.Age>=30).Count();
4)、多條件排序OrderBy().ThenBy().ThenBy()
lst.OrderBy(x=>x.Age).OrderBy(x=>x.Id)
5)、集合鏈接Join()(未理解)
6)SelectMany:把集合中每一個對象的另外集合屬性的值從新拼接爲一個新的集合
foreach(var s in teachers.SelectMany(t=>t.Students)){
Console.WriteLine(s);//每一個元素都是person
}
6)、延遲加載Where
在標準查詢運算符中,Where方法就是一個典型的延遲加載案例。在實際開發中,咱們每每會使用一些ORM框架例如EF去操做數據庫,Where方法的使用則是每次調用都只是在後續生成的Sql語句時增長一個查詢條件,EF沒法肯定本次查詢是否已經添加結束,因此沒有辦法在每一個Where方法執行的時候肯定最終的Sql語句.....
IEnumerable<User>user=lst.Where(x=>x.Age>=30);
7)、即時加載FindAll
在開發中若是使用FindAll方法,EF會根據方法中的條件自動生成SQL語句,而後當即與數據庫進行交互獲取查詢結果,並加載到內存中去。
List<User>lstUser=lst.FindAll(x=>x.Age>=30);
SQO缺點:語句太龐大複雜
十、LinQ
IEnumerable<Dog>listDogs=from dog in dogs where dog.Age>5 orderby dog.Age descending select dog;
以from開始,以select或group by子句結尾。輸出是一個IEnumerable<T>或IQueryable<T>集合。
注:T的類型由select或group by 推斷出來
LINQ分組:
..............
第四章 MVC進階
4.一、View詳解
View的職責是向用戶提供界面,負責根據提供的模型數據生成準備提供給用戶的格式界面,並提供用戶和系統交互的入口。
MVC支持多種視圖引擎(Razor和ASPX視圖引擎是官方默認給出的,其實還支持N種視圖引擎,甚至均可以是本身寫的視圖引擎)
4.1.一、View和Action之間數據傳遞的方式
View和Action之間先後臺數據傳遞的方式有以下幾種
弱類型ViewData[ ]
動態型ViewBag//dynamic
動態類型Model
臨時存儲TempData[ ]
後臺:return View(data);//存入ViewData.Model
前臺:Model//其實就是WebViewPage.Model
4.1.二、TempData、ViewData和ViewBag的區別
ViewData是字典型的,ViewBag不在是字典的鍵值對結構,而是dynamic(動態)型,會在程序運行的時候動態解析。ViewData爲object型,而ViewBag爲dynamic型。dynamic型與object型的區別是在使用時它會自動根據數據類型轉換,而object型則須要咱們本身去強制轉換
4.二、Razor視圖引擎
4.2.一、什麼是Razor
Razor是ASP.NET MVC 3.0出現的新的視圖引擎,爲視圖提供精簡的語法,最大限度減小了語法和額外字符串。Razor不是編程語言,而是服務器標記語言,是一種容許用戶向網頁中嵌入基於服務器代碼的標記語法
語境A:在前臺聲明和使用C#變量
@{
string schoolName="湖南第一師範";
}
<span>@schoolName.Models</span> @*錯誤*@
<span> @(schoolName).Models </span>
<span>我畢業於 @schoolName 學校</span>
說明:聲明C#變量的代碼必須寫在@{ }代碼塊中,使用@ + C#變量名就能取得C#變量的值,注意先後必須有空格,不然會被看成普通字符輸出。
語境B:郵件格式中的@符號
<span>zouqiongjun@uuch.net</span>@*經過,由於@前面沒有空格*@
<span>zouqiongjun @uuch.net</span>@*不經過, 由於@前面有空格*@
4.2.2 Razor語法
C#的主要語法規則以下:
Razor代碼封裝於@{......}中
行內表達式(變量和函數)以@開頭
代碼語句以分號結尾
字符串由引號包圍
c#代碼對大小寫敏感
c#文件的擴展名是.cshtml
Razor經過理解標記的結構來實現代碼和標記之間的順暢切換
@核心轉換字符,用來標記代碼的轉換字符串。
Razor表達式自動使用了HTML編碼
若是想向瀏覽器輸出HTML源代碼,那麼使用System.Web.IHtmlString:@Html.Raw("<b>zouyujie</b>")
<script>
alert('@Ajax.JavaScriptStringEncode("小李飛刀")');
</script>
@代碼塊
@{
string s="zouyujie";
int age=27;
}
@{Html.RenderPartial("TestPartial");}//調用無返回值方法
調用泛型方法:
@(Html.SomeMethod<User>());
混合代碼與文本:
@if(1==1){
<text>我要輸出文本在這裏</text>
@:我要輸出文本在這裏
}
說明:當前臺的C#
第五章 MVC核心透析
5.一、MVC Routing
在項目要使用Routing(路由),須要添加程序集引用System.Web.Routing.dll,而在ASP.NET MVC項目中則自動添加了此引用。嚴格來講,System.Web.Routing.dll並不屬於ASP.NET MVC的一部分,微軟把此項目單獨列出來了,並無開放源代碼,可是將來微軟也許會把Routing開源,畢竟開源是大勢所趨,並且微軟也在不斷地擁抱開源。
MapRoute()有以下重載,它們都是擴展方法。
public class AreaRegistrationContext{
private readonly HashSet<string> _namespaces;
public AreaRegistrationContext(string areaName,RouteCollection routes)
}
ASP.NET MVC全局開啓非入侵Ajax
ASP.NET MVC4 已經默認開啓客戶端驗證和非入侵式js。在Web.config中能夠看到以下配置:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
若是隻想在指定頁面使用此功能,能夠在頁面中單獨添加非入侵js文件:
@Scripts.Render("~/Scripts/jquery.unobtrusive-ajax.min.js")
.......
5.2.3 AjaxHelper
1.異步連接按鈕
使用異步連接按鈕時,必須開啓非入侵Ajax(導入JQuery和unbtrusive相關的Ajax文件)
(1)在View中,@Ajax.ActionLink建立Ajax
......
5.2.四、請求Json數據
添加控制器Json,在Controller中使用Json方法返回一個JsonResult:
NorthwindEntities db=new NorthwindEntities();
public ActionResult CustomersList(){
var dogList=db.Customers.Select(x=>new{ CustomerID=x.CustomerID,ContactName=x.ContactName,Phone=x.Phone}).ToList();
return Json(dogList,JsonRequestBehavior.AllowGet);
}
MVC框架默認不容許使用Json響應Get請求,須要開啓,開啓代碼爲JsonRequestBehavior.AllowGet。在GetView中添加代碼:
@Ajax.ActionLink("click here", "CustomersList",new AjaxOptions(){
UpdateTargetId="divMsg",
InsertionMode=InsertionMode.Replace,
HttpMethod="Get",
})