分部類和分部類型
每個局部聲明必須被表位partial class ,而不是單獨的關(guān)鍵字class兰英。
類和繼承
類繼承
通過繼承我們可以定義一個新類展融,新類納入一個已經(jīng)聲明的類進行擴展寞射。
- 可以使用一個已經(jīng)存在的類作為新類的基礎(chǔ)渔工。已存在的類稱為基類(base class),新類稱為派生類(derived class)桥温。派生類成員的組成如下:
- 自己聲明中的類引矩;
- 基類的成員。
- 要聲明一個派生類侵浸,需要在類名后加入基類規(guī)格說明旺韭。基類規(guī)格說明由冒號和后面跟著用作基類的名稱組成掏觉。派生類被描述為直接繼承自列出的基類区端。
- 派生類被描述為擴展它的基類,因為它包含了基類的額成員澳腹,夾傷在它自己的聲明中的任何附加功能织盼。
- 派生類不能刪除他所繼承的任何成員杨何。
例:
class OtherClass:SomeClass
{
...
}
繼承的成員可以被訪問,就像它們是派生類自己聲明的一樣沥邻。
所有類都派生自object類
object類是唯一的非派生類危虱,因為他是繼承層次結(jié)構(gòu)的基礎(chǔ)。
- 一個類聲明的基類規(guī)格說明中只能有一個單獨的類唐全,稱為單繼承槽地;、
- 雖然類只能直接繼承一個基類芦瘾,但繼承的層次沒有限制。
隱藏基類的成員
雖然派生類不能刪除它繼承的任何成員集畅,但可以隱藏它們近弟。
- 聲明一個新的相同類型的成員,并使用相同的名稱挺智;
- 聲明新的帶有相同簽名的函數(shù)成員祷愉,可以隱藏和掩蓋繼承的函數(shù)成員(簽名由名稱和參數(shù)列表組成,不包括返回類型)赦颇;
- 使用new修飾符二鳄;
-
也可以隱藏靜態(tài)成員。
image.png
基類訪問
使用基類訪問表達(dá)式訪問隱藏的基類成員
Console.WriteLine(“{0}”媒怯,base.field1);
虛方法和覆寫方法
虛方法可以使基類的訪問“升至”派生類內(nèi)订讼。
使用基類引用調(diào)用派生類的方法,需滿足下列條件:
- 派生類的方法和基類的方法有相同的簽名和返回類型扇苞;
- 基類的方法使用virtual標(biāo)注
- 派生類的方法使用override標(biāo)注
需注意:
- 覆寫和被覆寫的方法必須有相同的可訪問性欺殿。
- 不能覆寫static方法和非虛方法;
- 方法鳖敷,屬性和索引以及稱為事件的另一種成員類型脖苏,它們都可以被聲明為virtual和override。
覆寫標(biāo)記為override的方法
當(dāng)使用對象基類部分的引用調(diào)用一個覆寫的方法是定踱,方法的調(diào)用被沿派生層次上溯執(zhí)行棍潘,一直到標(biāo)記為override的方法的最派生版本。
如果在更高的派生級別有該方法的其他聲明崖媚,但沒有被標(biāo)記為override亦歉,那么他們不會被調(diào)用。
訪問級別
public:共有成員至扰,所有的類鳍徽,包括程序集內(nèi)部的類和外部的類都可以自由地訪問成員;
private:私有成員的限制是最嚴(yán)格的敢课,private類成員只能被它自己的類的成員訪問阶祭,它不能被其它的類訪問绷杜,包括繼承它的類。嵌套在它的類中的類的成員可以訪問濒募。
protected:受保護成員鞭盟,如同private的訪問級別,但它允許派生自該類的類訪問該成員瑰剃。
internal:內(nèi)部成員齿诉,標(biāo)記為internal的成員對程序集內(nèi)部的所有類可見,但對程序集外部的類不可見晌姚。
protected internal:受保護內(nèi)部成員粤剧,對所有繼承該類的類以及所有程序集內(nèi)部的類可見。
抽象成員
抽象成員是被設(shè)計來被覆寫的函數(shù)成員挥唠,它有以下特征:
- 它被用abstract修飾符標(biāo)記抵恋;
- 他沒有實現(xiàn)代碼塊。
注意: - 抽象方法必須在派生類中用相應(yīng)的方法覆寫宝磨,但不能把virtual修飾符附加到abstract修飾符弧关。
- 派生類中抽象方法的實現(xiàn)必須指定override修飾符。
- 抽象成員只能被聲明在抽象類中唤锉。
抽象類
抽象類只能被用作其他類的基類世囊。抽象類就是被設(shè)計來被繼承的。
- 不能創(chuàng)建抽象類的實例
- 抽象類使用abstract修飾符聲明窿祥。
- 抽象類可以包含抽象成員株憾,但不是必須的
- 抽象類自己可以派生自另一個抽象類。
-
任何派生自抽象類的類必須使用override的關(guān)鍵字實現(xiàn)該類的所有抽象成員晒衩,除非派生類自己也是抽象類号胚。
image.png
密封類
- 密封類只能被用作獨立的類,它不能被用作基類浸遗。
- 密封類使用sealead修飾符標(biāo)注猫胁。
sealed class MyClass
{
...
}
靜態(tài)類
靜態(tài)類用于分組不受實例數(shù)據(jù)影響的數(shù)據(jù)和函數(shù)。
- 類本身必須標(biāo)記為static跛锌;
- 類的所有成員必須是靜態(tài)的弃秆;
- 類可以有一個靜態(tài)構(gòu)造函數(shù),但沒有實例構(gòu)造函數(shù)髓帽,不能創(chuàng)建該類的實例菠赚;
- 不能繼承靜態(tài)類,它們是密封的郑藏;
訪問靜態(tài)成員衡查,使用雷鳴和成員名。
擴展方法
擴展方法重要的需求如下:
- 擴展方法必須被聲明為static必盖;
- 擴展方法聲明所在的類也必須被聲明為static拌牲;擴展方法必須包含關(guān)鍵字this關(guān)鍵字this作為它的第一個參數(shù)類型俱饿,并在后面跟著她它所擴展的類的名稱,作為第一個參數(shù)的類型塌忽。
extend 擴展
sealed class MyData
{
private double D1, D2, D3; //字段
public MyData(double d1,double d2,double d3) //構(gòu)造函數(shù)
{
D1 = d1;D2 = d2;D3 = d3;
}
public double Sum() //方法
{
return D1 + D2 + D3;
}
}
static class ExtendMyData //擴展的方法
{
public static double Average(this MyData md)
{
return md.Sum()/3;
}
}
class Program
{
static void Main(string[] args)
{
MyData md = new MyData(3,4,5);
Console.WriteLine("Sum:{0}",md.Sum());
Console.WriteLine("Average:{0}", md.Average());
Console.ReadKey();
}
}
輸出結(jié)果:
Sum:12
Average:4
外部方法
外部方法是在聲明中沒有實現(xiàn)的方法拍埠。
- 使用修飾符extern標(biāo)記,而且在類的聲明中沒有實現(xiàn)土居。它的實現(xiàn)被分號取代
public static extern int GetCurrentDirectory(int size,StringBuilder buf);
- 聲明和實現(xiàn)的連接時依賴實現(xiàn)的枣购,但常常使用DllImport特性完成。
表達(dá)式和運算符
條件運算符是三元運算符
條件擦耀?表達(dá)式1(為true時):表達(dá)式2(為false時)
typeof運算符返回作為它的參數(shù)的任何類型的system.type對象棉圈。通過這個對象,可以得到類型的特征眷蜓。
typeof運算符是一元運算符
Type t=typeof(SomeClass)
語句
語句是描述一個類型或告訴程序去執(zhí)行一個動作的源代碼指令迄损。
三種主要語句
- 聲明語句:聲明類型或變量的語句;
- 嵌入語句:執(zhí)行動作或管理控制流的語句账磺;
- 標(biāo)簽語句:控制可以跳轉(zhuǎn)到的語句;
條件執(zhí)行語句:
- if
- if···else
- switch
循環(huán)語句: - while
- do
- for
- foreach
跳轉(zhuǎn)語句 - break
- continue
- return
- goto
- throw
跳轉(zhuǎn)語句
break 執(zhí)行跳出最內(nèi)層封裝的語句 退出當(dāng)前循環(huán)
int x = 0;
while (true)
{
x++;
if (x > 5)
break;
Console.WriteLine(x);
}
Console.ReadKey();
運行結(jié)果為:
1
2
3
4
5
continue 退出此前循壞執(zhí)行下一次循環(huán)
for (int i = 0; i < 5; i++)
{
if (i<3)
{
continue; //回到循環(huán)開始處
}
Console.WriteLine(i);
}
Console.ReadKey();
運行結(jié)果為:
3
4
標(biāo)簽語句
標(biāo)簽語句形式:Identifier:Statement
標(biāo)簽語句的執(zhí)行完全如同標(biāo)簽不存在一樣痊远,并僅執(zhí)行Statement
部分垮抗。
- 給語句增加一個標(biāo)簽允許控制從代碼的另一部分轉(zhuǎn)移到該語句。
- 標(biāo)簽語句只允許在塊內(nèi)部碧聪。
標(biāo)簽語句標(biāo)識符不能是:
- 在重疊范圍內(nèi)核另一個標(biāo)簽標(biāo)識符相同冒版。
- 關(guān)鍵字。
標(biāo)簽語句的范圍是:
- 它聲明所在的塊
- 任何嵌套在該塊內(nèi)部的塊逞姿。
- 從范圍內(nèi)部的任何位置辞嗡,代碼都能跳出到標(biāo)簽語句
- 從外部代碼不能條魚到標(biāo)簽語句的塊
goto語句
goto語句無條件轉(zhuǎn)譯控制到一個標(biāo)簽語句。它的一般形式如下:
goto Identifier;
Identifier是標(biāo)簽語句滞造。
goto語句必須在標(biāo)簽語句的范圍之內(nèi)续室。
using語句
using語句幫助減少意外的運行時錯誤帶來的潛在問題,它整潔包裝了資源的使用谒养。
using語句隱式產(chǎn)生處置該資源的代碼挺狰。
它執(zhí)行下列內(nèi)容:
- 分配資源;
- 把Statement放進try塊买窟。
-
創(chuàng)建資源的Dispose方法的調(diào)用丰泊,并把它放進finally塊。
image.png
using語句的另一種形式
在這種形式中始绍,資源在using語句聲明之前聲明瞳购。
命名空間和程序集
編譯器接受源代碼文件并生成名稱為程序集的輸出文件。
using兩個編譯指令避免使用完全限定名:using命名空間指令亏推,using別名指令学赛。
using命名空間指令通知編譯器將要使用來自某個指定命名空間的類型年堆,然后可以繼續(xù)使用簡單類名而不必全路徑修飾它們。
using別名指令
using別名指令允許起一個別名給:
- 命名空間
- 命名空間的一個類型
程序集的結(jié)構(gòu)
程序集不包含本地代碼罢屈,而是公共中間代碼嘀韧。他還包含實時編譯器在運行時轉(zhuǎn)換cil到本機代碼的一切,包括對他所引用的其他程序集的引用缠捌。程序及的文件擴展名通常為.exe或.dll锄贷。
程序集四個主要部分
- 程序集的清單
- 程序集名稱標(biāo)識符
- 組成程序集的文件列表
- 一個指示程序集中內(nèi)容在哪里的地圖
- 關(guān)于引用的其他程序集的信息
- 類型元數(shù)據(jù)部分包含該程序集定義的所有類型的信息。這些信息包含關(guān)于每個類型要知道的所有中間代碼曼月。
- CIL部分包含程序集的所有中間代碼谊却。
-
資源部分是可選的,但可以包含圖形和語言資源哑芹。
image.png
對于有多個模塊的程序集炎辨,一個文件是主要模塊,而其他是次要模塊
- 主模塊含有程序集的清單和到次要模塊的引用
- 次要模塊的文件名以擴展名.netmodule結(jié)尾
-
多文件程序被視為一個單一單元聪姿。它們一起部署并一起定版碴萧。
image.png
程序集標(biāo)識符
程序集標(biāo)識符有四個組成部分,它們一起唯一標(biāo)識了該程序集末购,如下所示
- 簡單名:這只是不帶擴展名的文件名破喻。每個程序集都有一個簡單名。他也被稱為程序集名或友好名稱(friendly name)
- 版本號:由四個句點分開的證書字符串組成盟榴,例如2.0.35.9
- 文化信息:它是一個字符串曹质,有2~5個字符組成,代表一種語言或代表一個國家或地區(qū)擎场,例如en-US
-
公匙:這個128字節(jié)字符串應(yīng)該是生產(chǎn)該程序集的公司唯一的
image.png
強命名程序集
強命名程序集有一個唯一的數(shù)字簽名衣服與他羽德。強命名程序集比沒有強名稱的程序集更加安全,這是由于以下原因:
- 強名稱唯一標(biāo)識了程序集迅办。沒有其他人能創(chuàng)建一個與之有相同名稱的程序集宅静,所以用戶可以確信改程序機來自于其生聲稱的來源。
- 沒有CLR安全組件來捕獲更改站欺,帶強名稱的程序集的內(nèi)容不能被改變坏为。
弱命名程序集是沒有被強命名的程序集。不安全的
程序員不產(chǎn)生強名稱镊绪。編譯器產(chǎn)生他匀伏,接受關(guān)于程序集的細(xì)膩,并哈希這些信息以創(chuàng)建一個唯一的數(shù)據(jù)簽名依附到該程序集蝴韭。他在哈希處理中使用的信息如下: - 組成程序集的字節(jié)序列
- 簡單名稱
- 版本號
- 文化信息
- 公匙/私匙對