柚子快報邀請碼778899分享:【無標題】 C#的學習筆記
柚子快報邀請碼778899分享:【無標題】 C#的學習筆記
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?C# 學習筆記
一.類與命名空間
類與命名空間都是一個抽象的概念。
個人的理解,命名空間相當于是很多類的集合,要想使用類中的特定功能,需要命名空間的調(diào)用。using System;
類中包括三大成員:屬性,方法,事件。通過使用類中的相關(guān)內(nèi)容,對程序進行實現(xiàn)。(不同類對于屬性,方法和事件的側(cè)重不同)
命名空間,類的引用有黑盒引用和白盒引用。
二.對象與實例化
對象:一般是稱現(xiàn)實生活中所研究的物體。
類,中有很多的屬性,這是抽象的概念。而類要實例化,并且對他附加屬性。不能說飛機怎樣怎樣,但是一個飛機可以怎樣怎樣,這是我們可以實現(xiàn)的。
? ` ? Form myForm =new Form();`
? ? ? `myForm.Text ="My Form";`
?
? myForm.ShouDialog();`
三.C#語言的基本元素
關(guān)鍵字 操作符 標識符 標點符號 文本 空白與注釋
3.0F :單精度浮點型;
4.0D:雙精度類型;
long L 64比特位; var自動獲取類型。
變量 與方法(算法/函數(shù))
四.類型在C#語言中的作用
一個C#類型中包含的信息有:
存儲此類型的所需內(nèi)存大小 此類型的值表示的最大,最小范圍 此類型所包含的成員 此類型的基派衍生 此類型變量分配在內(nèi)存的位置 Stack 與 Heap 運算
C#是強制類型語言,dynamic 兼容了動態(tài)類型。
五.C#語言的數(shù)據(jù)類型系統(tǒng)
C#語言的類型系統(tǒng)
引用類型:類,接口,委托 object string(1.太常用的數(shù)據(jù)類型,變?yōu)榱岁P(guān)鍵字 2.最基本的構(gòu)成其他的) class interface delegate 值類型:結(jié)構(gòu)體,枚舉 bool byte char decimal double float int long sbyte short uint ulong ushort (1.太常用的數(shù)據(jù)類型,變?yōu)榱岁P(guān)鍵字 2.最基本的構(gòu)成其他的) struct enum true false void null var dynamic
六.C#變量,對象與內(nèi)存
變量是儲存數(shù)據(jù)的
var 隱式變量,編譯器自己推斷是什么變量。 變量=以變量名所對應(yīng)的內(nèi)存地址為起點,以其數(shù)據(jù)類型所要求的存儲空間為長度的一塊內(nèi)存區(qū)域。 變量表示了存儲位置,并且每個變量都有一個類型,以決定什么樣的值能夠存入變量
靜態(tài)變量,實例變量(字段),數(shù)組元素,值參數(shù),引用參數(shù),輸出形參,局部變量, 狹義上,變量指的是局部變量。 值類型變量,值類型沒有實例,所謂的”實例“與變量合而為一。(不用new) 引用類型的變量與實例
引用類型變量與實例關(guān)系:引用類型變量里存儲的數(shù)據(jù)是對象的內(nèi)存地址。 訪問對象的屬性,是在堆上開辟空間。 局部變量在stack上分配內(nèi)存 變量默認值為0;(stack上未賦值的局部變量會報錯) 裝箱與拆箱
裝箱是:把棧上的數(shù)據(jù)存儲到堆上,而拆箱:是把堆上的數(shù)據(jù)移動回棧上。 裝箱與拆箱都會消耗性能。
七.方法(函數(shù))
方法的前身是C/C++語言中的函數(shù)(function)
方法是面向?qū)ο蠓懂牭母拍?,在非面向?qū)ο笳Z言中仍然成為函數(shù)。 可以理解為,把函數(shù)封裝成立類的一個成員屬性,這個屬性理解為方法。 永遠都是類(結(jié)構(gòu)體的)成員
C#語言中函數(shù)不可能獨立于類(結(jié)構(gòu)體)之外 只有作為類的成員才能被稱為方法 C++中是可以稱為”全局函數(shù)“ 類與結(jié)構(gòu)體最基本的成員有:字段與方法,本質(zhì)還是算法與數(shù)據(jù)。方法表示的是可以做什么事情
需要的原因是:1.隱藏復(fù)雜的邏輯 2.把大算法變成小算法 3.復(fù)用 命名的規(guī)范
大小寫的規(guī)范,單詞全部首字母大寫 用動詞或者動詞短語作為名字 static修飾需要對類進行調(diào)用,而不是實例化調(diào)用 C#是強類型語言,值與變量的類型一定要匹配,不然編譯器會報錯。
八.Overload
構(gòu)造器:是類的成員之一(狹義的構(gòu)造器是“實例構(gòu)造器”); 構(gòu)造器可以要求強制初始化; 聲明帶有重載的方法
方法簽名由方法的名稱,類型形參的個數(shù)和它的每一個形參(從左到右的順序)的類型和種類(值,引用或輸出)組成,方法簽名不包含返回類型。 實例構(gòu)造函數(shù)前面由它的每一個形參(從左到右的順序)類型和種類(值,引用或輸出)組成。 重載決策(調(diào)用哪個重載)選擇。
九.操作符
本質(zhì):1.操作符的本質(zhì)是函數(shù)(算法)的“簡計法” 2.操作符要與數(shù)據(jù)類型關(guān)聯(lián) default操作符:1.結(jié)構(gòu)體類型,將內(nèi)存中的值全部刷為0,并且返回0; 2.枚舉類型,枚舉中變量會有其對應(yīng)的值,返回為0的 3.引用類型,也是全刷為0,返回的是null new:1.在內(nèi)存當中創(chuàng)造類的實例,并且立刻調(diào)用實例構(gòu)造器(也可以調(diào)用初始化器)
2.有賦值操作符,會把實例的地址賦值給變量
checked 與unchecked 是操作符但是常用的是上下文 ? uint x=uint.MaxValue;
?Console.WriteLine(x);
?string binStr=Convert.ToString(x);
?Console.WriteLine(binStr);
?unchecked(檢查與不檢查一個值在內(nèi)存中是否溢出)上下文
{
? ? ?try
? ? {
? ? ? ? ?uint y = x + 1;
? ? ? ? ?Console.WriteLine(y);
? ? }
? ? ?catch (OverflowException ex)
? ? {
? ? ?Console.WriteLine("There ");
? ? }
}
? delegate 操作符被更加簡單的 Lambda 表達式取代了。與匿名函數(shù)的創(chuàng)建有關(guān)。 is操作符是判斷是否為某類的實例化,要求需要符合邏輯 as 操作符,是是否像什么一樣,一樣返回地址,不一樣返回null ? 與??操作符 int? x = null; int y = x ?? 10; Console.WriteLine(y);
十.類型轉(zhuǎn)換
隱式類型轉(zhuǎn)換
不丟失精度的轉(zhuǎn)換(int->long) 子類向父類轉(zhuǎn),類是子類從父類繼承,子類可以繼承父類的屬性,但是父類可以容納子類的地址,但是屬性不可為子類,而為父類的屬性。 裝箱 顯式類型轉(zhuǎn)換
可能會丟失精度(甚至產(chǎn)生錯誤)轉(zhuǎn)換 拆箱 Convert類的使用 ToString方法(object 最基礎(chǔ)的屬性),以及Parse/TryParse方法
double.Parse("123");這個字符串必須正確,否則沒有辦法轉(zhuǎn)換 自定義的類型轉(zhuǎn)換操作符 類型轉(zhuǎn)換也相當于是函數(shù) namespace studyC_
{
? ?internal class Program
? {
? ? ? ?static void Main(string[] args)
? ? ? {
? ? ? ? ? ?Stone stone= new Stone();
? ? ? ? ? ?stone.Age = 5000;
? ? ? ? ? ?Monkey wukongSun = (Monkey)stone;
? ? ? ? ? ?Console.WriteLine(wukongSun.Age);
? ? ? }
? }
? ?class Stone
? {
? ? ? ?public int Age;
? ? ? ?public static explicit operator Monkey(Stone stone)
? ? ? {
? ? ? ? ? ?Monkey m= new Monkey();
? ? ? ? ? ?m.Age = stone.Age/500;
? ? ? ? ? ?return m;
? ? ? }
? }
?
? ?class Monkey
? {
? ? ? ?public int Age;
? }
?
}
十一.語句詳解
語句的分類
標簽語句,嵌入式語句,聲明語句 try 語句 try catch final語句
try { } catch(ArgumentNullException/FormatException/OverflowExceptin) { } catch 的問題還可以throw ,throw 可以把問題拋給調(diào)用的實例,然后再try,catch。 throw的使用很是靈活。 foreach語句,遍歷枚舉一個集合元素。并對該集合中每個元素執(zhí)行一次相關(guān)的嵌入語句。
可以被遍歷的集合:數(shù)組和泛型的實例。所有數(shù)組類型都是Array這個基類。 Array的一個接口,I開頭 IEnumerable 這個接口只有一個方法,GetEnumerator()迭代器。 迭代器,using System.Collections; 儲存迭代器容器IEnumerable它有3個object,Current 是當前, Reset( )是撥回去,MoverNext( )是下一個。 List
十二.字段,屬性,索引,常量(類和結(jié)構(gòu)體所具有的成員)
字段
字段(field)與對象或類型(類與結(jié)構(gòu)體)關(guān)聯(lián)的變量 與對象關(guān)聯(lián)的字段叫做”實例字段“,與類型關(guān)聯(lián)的字段”靜態(tài)字段“,由static修飾,調(diào)用的時候也是直接調(diào)用。 字段的修飾,只讀字段可以初始化(構(gòu)造器初始化),但是不能夠賦值。(readonly),只讀字段的初始化是要借用構(gòu)造器,但決定不能賦值。(靜態(tài)與非靜態(tài)一樣) 屬性
set 與 get 使用 set 是設(shè)置值的,get是獲取值的
propfull 可以快捷設(shè)置get set 屬性是一種用于訪問對象或類型的特征的成員,特征反映了狀態(tài) 屬性是字段的自然擴展
field更偏向于實例對象在內(nèi)存中的布局,property更偏向于反映現(xiàn)實世界的特征 對外:暴露數(shù)據(jù),數(shù)據(jù)可以存儲在字段里,也可以是動態(tài)計算出來的 對內(nèi):保護字段不被非法值”污染“ 屬性由Get/Set方法進化而來,是一種語法糖 實例屬性,與靜態(tài)屬性(static) 只讀屬性只有g(shù)etter,沒有set,怎樣賦值都會報錯。 private set { },的話,只能在類里面進行賦值,在外面沒有辦法訪問。 要用屬性暴露數(shù)據(jù),而字段都是private或protected 索引器
它可以使對象能夠與數(shù)組相同的方式進行索引。index 常量
為了提高程序可讀性與執(zhí)行效率——常量 為了防止對象值被改變——只讀字段 向外暴露不允許修改的數(shù)據(jù)——只讀屬性 當希望成為常量的值其類型不能被常量聲明接時——靜態(tài)只讀字段。
十三.參數(shù)
傳值參數(shù)
傳值參數(shù)與值類型 :創(chuàng)建變量的副本 對值參數(shù)操作不會影響變量的值 傳值參數(shù)與引用類型,要創(chuàng)建新對象
值參數(shù)創(chuàng)建變量副本,對值參數(shù)的操作永遠不影響變量值 只操作對象,不創(chuàng)建新對象
對象還是那個對象,但是對象中的值已經(jīng)改變了 引用參數(shù)
引用參數(shù)與值類型:不創(chuàng)建變量副本,ref修飾符顯式指出----此方法的副作用是改變實際參數(shù)的值 引用參數(shù)與引用類型,創(chuàng)建新對象
引用參數(shù)不創(chuàng)建變量副本,ref修飾符顯式指出---改變實參值 不創(chuàng)建新對象只改變值
與傳值參數(shù)效果相同,但是機理不同 輸出參數(shù)
輸出參數(shù)與值類型:輸出參數(shù)并不創(chuàng)建變量的副本,方法體內(nèi)必需有對輸出變量的賦值操作,使用out修飾符顯式指出----此方法的副作用是通過參數(shù)向外輸出值,ref是為了改變,out是為了輸出。 輸出參數(shù)與引用類型:輸出參數(shù)不創(chuàng)建副本,方法體內(nèi)必須要有對輸出變量賦值的操作,使用out修飾符顯式指出----此方法的副作用是通過參數(shù)向外輸出值,ref是為了改變,out是為了輸出。 Console.WriteLine("please write a number"); string arg1 =Console.ReadLine(); double x = 0; bool b1=double.TryParse(arg1, out x); if(b1 == false ) { Console.WriteLine("your enter has error"); return; } 數(shù)組參數(shù)
必須是形參列表中最后一個,由params修飾 str.Splist('.' , ','); 具名參數(shù)
參數(shù)的位置不再受約束 可選參數(shù)
參數(shù)因為有默認值而變得”可選“ this 參數(shù)
公用,靜態(tài)的,public static所修飾 必須是形參列表中第一個,由this修飾 必須由一個靜態(tài)類,一般類名為SomeTypeExtension,來同意收納擴展方法 LINQ方法 總結(jié) 傳值參數(shù):參數(shù)的默認傳遞方法 輸出參數(shù):用于除返回值外還需要輸出的場景 引用參數(shù):用于需要修改實際參數(shù)值的場景 數(shù)據(jù)參數(shù):用于簡化方法的調(diào)用 具名參數(shù):提高可讀性 可選參數(shù):參數(shù)擁有默認值 this參數(shù):為目標數(shù)據(jù)類型”追加“方法
十四.委托和聲明
委托(delegate)是函數(shù)指針的”升級版“ `Calculatar calculatar = new Calculatar();` `calculatar.Report();` `Action action = new Action(calculatar.Report);` `action.Invoke();` action(); 一切皆是地址
變量(數(shù)據(jù))是以某個地址為起點的一段內(nèi)存中所儲存的值 函數(shù)(算法)是以某個地址為起點的一段內(nèi)存中所存儲的一組機器語言指令 直接調(diào)用與間接調(diào)用
直接調(diào)用:通過函數(shù)名來調(diào)用函數(shù),CPU通過函數(shù)名直接獲得函數(shù)所在地址并開始執(zhí)行--->返回 間接調(diào)用:通過函數(shù)指針調(diào)用函數(shù),CPU通過讀取指針存儲的值獲得函數(shù)所在地址并開始執(zhí)行--->返回 Java中沒有與委托相對應(yīng)的功能實體 委托的簡單使用
Action委托 Func委托 委托是一種類(總的命名空間里面),類是數(shù)據(jù)類型所有委托也是一種數(shù)據(jù)類型 它的聲明方式與一般的類不同,主要是為了照顧可讀性和C/C++傳統(tǒng) delegate type Calc(type x,type` y);
委托的高級使用
多播(multicast)委托 隱式異步調(diào)用
同步與異步
同步:你做完了我(在你的基礎(chǔ)上)接著做 異步:咋們兩個同時做(中文意思是同步進行) 同步調(diào)用與異步調(diào)用的對比
每一個運行的程序都是一個進程(process) 每個進程可以有一個或者多個線程(thread) 同步調(diào)用是在同一個線程內(nèi) 異步調(diào)用的底層機制是多線程 串行= =同步= =單線程。并行= =異步= =多線程 隱式多線程 與 顯式多線程
直接同步調(diào)用:使用方法名 間接同步調(diào)用:使用單播/多播委托的Invoke方法 隱式異步調(diào)用:使用委托的BenginInvoke 顯示異步調(diào)用:使用Thread或Task 應(yīng)當適當?shù)厥褂媒涌冢╥nterface)取代一些對委托的使用
java完全用接口取代了委托的功能,即Java沒有與C#中委托相對應(yīng)的功能實體
十五.事件
初步了解事件
定義:”能夠發(fā)生什么事情“ 角色:使對象或類具備通知能力的成員
An event is a member that enables an object or class to provide notifications 使用:事件模型
1.關(guān)心的事情 2.有東西關(guān)心這個事件 3.事件發(fā)生了 4.這個關(guān)心的東西被依次通知到了 5.處理事件 注意:
事件多用于桌面,手機等開發(fā)客戶端編程 各種語言實現(xiàn)方法并不相同 Java接口來實現(xiàn) MVC,MVP,MVVM是事件更加高級,更有效的”玩法“
事件的應(yīng)用
派生(繼承)與擴展(extends) 事件模型五部分
event source event eventsubsciber eventhandler order 注意
事件處理器是方法成員 掛接事件處理器的時候,可以使用委托實例,也可以直接使用方法名,”語法糖“ 事件處理器對事件的訂閱不是隨意的,匹配與否由聲明事件時所使用的委托類型來檢測 事件可以同步調(diào)用也可以異步調(diào)用
事件的聲明
事件的聲明
完整聲明 簡略聲明(字段式聲明,field-like) 原因:謹防”借刀殺人“ 事件的本質(zhì)是委托字段的一個包裝器
這個包裝器對委托字段的訪問起限制作用,相當于”蒙版“ 封裝(encapsulation)的一個重要功能就是隱藏 事件對外界隱藏了委托實例的大部分功能,僅暴露添加/移除事件處理器的功能 添加/移除事件處理器的時候可以直接使用方法名,這是委托實例所不具備的功能 用于聲明事件的委托類型的命名約定
用于聲明Foo事件的委托,一般命名為FooEvebtHandler(除非是一個非常通用的事件約束) FooEventHandler委托的參數(shù)一般有兩個
第一個是object類型,名字為sender,實際上就是事件的擁有者,事件的source 第二個是EventArgs類的派生類,類名一般為FooEventArgs,參數(shù)名為e。事件參數(shù) 雖然沒有官方說法,但是我們可以把委托的參數(shù)列表看成是事件發(fā)生后發(fā)送給事件響應(yīng)者的”事件消息“ 觸發(fā)Foo事件的方法一般命名為OnFoo,即”因何引發(fā)“,”事出有因“
訪問級別為protected,不能為public,否則又是”借刀殺人“了 事件的命名約定
帶有時態(tài)的動詞或者動詞短語 事件擁有者“正在做”什么事,用進行時;事件擁有者“做完了”什么事情,用完成時 事件與委托的關(guān)系
事件聲明的時候使用了委托類型,簡化聲明造成事件看上去像一個委托的字段(實例),而event關(guān)鍵字更像是一個修飾符-----這就是錯覺來源。 事件的本質(zhì)是加裝在委托字段上的一個“蒙版”,是個起掩蔽作用的包裝器。這個用于阻擋非法操作的“蒙版”絕不是委托字段本身 為什么要使用委托類型聲明事件
source角度,source能對外傳遞那些消息 subscriber的角度,一種約定,為了約束能夠使用什么樣的簽名方法來處理,(響應(yīng)事件) 委托類型的實例用于儲存事件處理器 對比事件與屬性
屬性不是字段——很多時候?qū)傩允亲侄蔚陌b器,這個包裝器用來保護字段不被濫用 事件不是委托字段——它是委托字段的包裝器,這個包裝器用來保護委托字段不被濫用 包裝器永遠都不可能是被包裝的東西
十六.類(聲明即定義)
是一種數(shù)據(jù)結(jié)構(gòu) 一種數(shù)據(jù)類型 代表現(xiàn)實世界中的“種類”
析構(gòu)器(析構(gòu)函數(shù))
~Student(){ } 只要創(chuàng)造了實例,析構(gòu)器就會被調(diào)用,釋放一個對象的
類的繼承
類在功能上的擴展,只能有一個基類,但是可以實現(xiàn)多個基接口 private < protected < internal < public
private 僅僅只能在類內(nèi)部調(diào)用,最低級的訪問級別 protected 自己與自己的子類可以調(diào)用 internal 僅為同項目,是單獨的項目。 public 最高級的訪問級別,所有成員對所有人都是可以取用 sealed類修飾說明該類不能被繼承或者重寫。 成員的繼承與訪問
派生類對繼承成員的訪問 派生類對基類成員的訪問 構(gòu)造器不可繼承,如果基類的構(gòu)造器初始化了,衍生類的構(gòu)造器必須初始化 ? ?class Vehicle
? {
? ? ? ?public string Owner { get; set; }
? ? ? ?public Vehicle(string owner)
? ? ? {
? ? ? ? ? ?this.Owner = owner;
? ? ? }
? }
? ?class Car:Vehicle
? {
? ? ? ?public Car(string name) : base(name)
? ? ? {
? }
? ? ? ?public void Report()
? ? ? {
? ? ? ? ? ?Console.WriteLine(Owner);
? ? ? }
? }
? “橫向擴展” (成員越來越多)
多態(tài)----類的縱向繼承
行為不變,版本升高 重寫與隱藏:函數(shù)成員,可見,簽名一致 多態(tài)基于重寫機制(virtual---->override) class Vehicle
{
? ? private int _speed;
? ? public virtual int Speed
? ? {
? ? ? ? get
? ? ? ? {
? ? ? ? ? ? return _speed;
? ? ? ? }
? ? ? ? set
? ? ? ? {
? ? ? ? ? ? _speed = value;
? ? ? ? }
? ? }
? ? public virtual void Run()
? ? {
? ? ? ? Console.WriteLine("I am running");
? ? ? ? _speed = 100;
? ? }
}
?
class Car : Vehicle
{
? ? private int _rpm;
? ? public override void Run()
? ? {
? ? ? ? Console.WriteLine("Car is running");
? ? ? ? _rpm = 10000;
? ? }
? ?public override int Speed
? ? {
? ? ? ? get { return _rpm/100; }
? ? ? ? set { _rpm = value * 100; }
? ? }
}
十七.接口和抽象類
接口和抽象類都是“軟件工程產(chǎn)物” 具體類——>抽象類——>接口:越來越抽象,內(nèi)部實現(xiàn)的東西越來越少 抽象類是未完全實現(xiàn)邏輯的類(可以有字段和非public成員,它們代表了“具體邏輯”) 抽象類為復(fù)用而生:專門作為基類來使用,也有解耦功能 ? ?static int Sum(int[] nums)
? {
? ? ? ?int sum = 0;
? ? ? ?foreach(var n in nums) sum += n;
? ? ? ?return sum;
? }
?
? ?static double Avg(int[] nums)
? {
? ? ? ?int sum = 0;double count = 0;
? ? ? ?foreach(var n in nums) { sum += n;count++; }
? ? ? ?return sum/count;
? }
? ?static double Avg2(ArrayList nums)
? {
? ? ? ?int sum = 0; double count = 0;
? ? ? ?foreach(var n in nums) { sum =sum+(int)n; count++; }
? ? ? ?return sum/count;
? } 封裝確定的,開放不確定的,推遲到合適的子類中去實現(xiàn) 接口是完全未實現(xiàn)邏輯的“類”(純虛類,只有函數(shù)成員,成員全部public) 接口為解耦而生:“高內(nèi)聚,低耦合”,方便單元測試 接口是一個“協(xié)約” 他們不能夠?qū)嵗荒苡脕砺暶髯兞?,引用具體類的實例 interface VehicleBase
{
? ? void Stop();
? ? void Run();
? ? void Fill();
?
}
abstract class Vehicle : VehicleBase
{
? ? public void Stop()
? ? {
? ? ? ? Console.WriteLine("Stopped!");
? ? }
? ? public void Fill()
? ? {
? ? ? ? Console.WriteLine("pAY AND FILL");
}
abstract public void Run();
}
?
class Car:Vehicle
{
? ? public override void Run()
? ? {
? ? ? ? Console.WriteLine("Car is running");
? ? }
}
?
class Truck:Vehicle
{
? ? public override void Run()
? ? {
? ? ? ? Console.WriteLine("T is running");
? ? }
}
接口與單元測試
接口的產(chǎn)生:自底向上(重構(gòu)),自頂向下(設(shè)計) C#中接口的實現(xiàn)(隱式,顯式,多接口) 原則:倚賴反轉(zhuǎn)原則,接口隔離,開/閉原則
接口隔離原則,一個類只做相關(guān)一件事(接口存在兩個以上的接口使用,包含了太多功能,有一部分功能實現(xiàn)不了)
十八.反射與注入
反射:以不變應(yīng)萬變(更松的耦合),反射機制,封裝好的反射,邏輯并不確定 反射與接口的結(jié)合 反射與特性的結(jié)合 依賴注入 ITank tank = new HeavyTank();
var t=tank.GetType();
object o=Activator.CreateInstance(t);
?
MethodInfo FireMi = t.GetMethod("Fire");
MethodInfo RunMi =t.GetMethod("Run");
?
FireMi.Invoke(o, null);
RunMi.Invoke(o, null);
?
十九.泛型與partial類
泛型
為了避免成員膨脹或者類型膨脹 正交性:泛型類型(類/接口/委托......) 泛型成員(屬性/方法/字段......) class Box
{
? ? public T Cargo { get; set; }
} 類型方法的參數(shù)推斷 ? ?static T[] Zip
? {
? ? ? ?T[] Z = new T[A.Length + B.Length];
? ? ? ?int a = 0; int b = 0; int c = 0;
? ? ? ?do
? ? ? {
? ? ? ? ? ?if (a < A.Length) Z[c++] = A[a++];
? ? ? ? ? ?if (b < B.Length) Z[c++] = B[b++];
? ? ? } while (a < A.Length || b < B.Length);
?
? ? ? ?return Z;
? } partial類
減少類的派生 分成多部分進行編寫,可以用不同語言編寫
二十.lambda表達式
lambda表達式,用來表達匿名的方法,inline方法
? ? ? ?Func
柚子快報邀請碼778899分享:【無標題】 C#的學習筆記
參考鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。