亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

《.net框架程序設(shè)計(jì)》學(xué)習(xí)

系統(tǒng) 1610 0
前言
Microsoft .net平臺(tái)組成
底層操作系統(tǒng): windows
--Microsoft .NET Passport XML Web 服務(wù)支持
--即時(shí)消息通知應(yīng)用程序
--.NET 企業(yè)服務(wù)器:
l Microsoft Application Center 2000
l Microsoft BizTalk Server 2000
l Microsoft Commerce Server 2000
l Microsoft Exchange 2000
l Microsoft Host Integration Server 200
l Microsoft Internet Security and Acceleration(ISA) Server 2000
l Microsoft Mobile Information Server 2002
l Microsoft SQL Server 2000
--Microsoft XML Web 服務(wù):.NET My Services
http://www.Microsoft.com/MyServices/
開發(fā)平臺(tái):.NET FrameWork
有兩個(gè)部分:通用語(yǔ)言運(yùn)行時(shí)(Common Language Runtime:CLR)和.NET 框架類庫(kù)(Framework Class Library:FCL)
特征如下:
l 一致的編程模型。完全面向?qū)ο髾C(jī)制和豐富的FCL使編程模型一致
l 簡(jiǎn)化的編程方式。簡(jiǎn)化Win32和COM環(huán)境下所需的復(fù)雜基礎(chǔ)構(gòu)造(注冊(cè)表、GUID、IUnknown、AddRef、Release、HRESULT等等)
l 可靠的版本機(jī)制。徹底消除“DLL hell”的大門
l 輕便的部署管理。安裝程序不再使用注冊(cè)表,而是直接進(jìn)行拷貝
l 廣泛的平臺(tái)支持。對(duì)ECMA的CLR和FCL兼容的機(jī)器都可以運(yùn)行
l 無(wú)縫的語(yǔ)言集成。遵循通用語(yǔ)言規(guī)范(Common Language Specification:CLS)書寫的類型可以在不同語(yǔ)言之間互用
l 簡(jiǎn)便的代碼復(fù)用。
l 自動(dòng)化的內(nèi)存管理(垃圾回收)。對(duì)內(nèi)存以及諸如文件、屏幕空間、網(wǎng)絡(luò)連接、數(shù)據(jù)庫(kù)等資源的管理
l 堅(jiān)實(shí)的類型安全
l 豐富的調(diào)試支持。CLR完全支持跨語(yǔ)言調(diào)試
l 統(tǒng)一的錯(cuò)誤報(bào)告。強(qiáng)大的異常處理機(jī)制;CLR中的異常具有跨模塊和跨語(yǔ)言特性
l 全新的安全策略。CLR中的代碼訪問(wèn)安全(CAS)為我們提供了以代碼為中心的安全控制方式
l 強(qiáng)大的互操作能力。對(duì)訪問(wèn)現(xiàn)有COM組件以、傳統(tǒng)DLL以及WIN32函數(shù)提供支持
集成開發(fā)環(huán)境:Visual Studio .NET
對(duì)所有的開發(fā)語(yǔ)言,有統(tǒng)一的IDE。
第一章 ?? Microsoft .NET 框架開發(fā)平臺(tái)體系結(jié)構(gòu)
一、 ???????????? 將源代碼編譯為托管模塊:
?
1、 ? CLR的存在是得我們可以選擇適合表達(dá)邏輯的語(yǔ)言,只要存在相應(yīng)得編譯器將代碼編譯成為面向CLR的代碼即可,結(jié)果成為托管模塊。
2、 ? 托管模塊(managed module):是一個(gè)需要CLR才能執(zhí)行的標(biāo)準(zhǔn)windows可移植可執(zhí)行文件(portable executable:PE),組成:
1) ??????? PE表頭:指出文件類型,文件的時(shí)間標(biāo)記
2) ??????? CLR表頭:CLR版本,托管模塊入口、元數(shù)據(jù)、資源、強(qiáng)命名、標(biāo)記等信息
3) ??????? 元數(shù)據(jù):源代碼中定義、引用的類型和成員
4) ??????? 中間語(yǔ)言(IL)代碼
關(guān)于元數(shù)據(jù):
l ???????? 總與IL代碼同步
l ???????? 省去源代碼編譯時(shí)對(duì)頭文件和庫(kù)文件的需求
l ???????? Visual Studio .NET利用之進(jìn)行智能感知,輔助編碼
l ???????? 用于CLR的代碼驗(yàn)證
l ???????? 序列化及反序列化對(duì)象
l ???????? 垃圾收集器可以追蹤對(duì)象的生存期
二、 ???????????? 將托管模塊組合為程序集
關(guān)于程序集的理解: 暫歇
三、 加載通用語(yǔ)言運(yùn)行時(shí)
1、 ? 通過(guò)在%window%\system32目錄下查找MSCorEE.dll文件來(lái)判斷一個(gè)機(jī)器中是否安裝了.NET框架;而框架的版本可從注冊(cè)表下的子鍵:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ .NETFramework \ policy中查看
2、 當(dāng)生成一個(gè) EXE 程序集時(shí),編譯器/鏈接器會(huì)產(chǎn)生一些特殊的信息,并將它們嵌入到結(jié)果程序集的 PE 文件表頭及其各個(gè)組成文件的 .text 部分。當(dāng) EXE 文件被調(diào)用時(shí),這些特殊的信息將導(dǎo)致 CLR 被加載并初始化。 CLR 隨后會(huì)定位至應(yīng)勝程序的入口點(diǎn)方法,從面以此來(lái)啟動(dòng)應(yīng)用程序。
?
類似地,如果是一個(gè)非托管應(yīng)用程序通過(guò)調(diào)用 LoadLibrary 來(lái)加載一個(gè)托管程序集,那么該托管程序集 DLL 的入口點(diǎn)函數(shù)也會(huì)知道去加載 CLR 來(lái)處理包含在其中的代碼
3、 ? 其他諸如 EXE 程序集或 DLL 程序集如何被執(zhí)行的過(guò)程,可在考察普通 Windows PE 文件的執(zhí)行過(guò)程后進(jìn)行比較以明確執(zhí)行過(guò)程
四、 執(zhí)行程序集代碼
1、 ? IL代碼:一種面向?qū)ο蟮臋C(jī)器語(yǔ)言。可以理解對(duì)象類型,包含高級(jí)指令:創(chuàng)建和初始化對(duì)象、調(diào)用對(duì)象上的虛方法、直接操作數(shù)組元素、拋出和捕獲異常;
IL匯編語(yǔ)言能獲取CLR的所有功能,其他高級(jí)語(yǔ)言智能獲取其中的一個(gè)子集;
IL代碼獨(dú)立于CPU平臺(tái),執(zhí)行時(shí)要先被即時(shí)編譯器(Just In Time Compiler)編譯;
微軟提供的IL匯編器:ILAsm.exe 反匯編器:ILDasm.exe。
2、 ? IL代碼執(zhí)行過(guò)程:
以下面代碼段為例:
??????? static void Main()
??????? {
?????????????? Console.WriteLine(“Hello”);
?????????????? Console.WriteLine(“GoolBye”);
}
?0 )代碼被執(zhí)行之前:
???? CLR 首先檢測(cè)Main中代碼所引用到的所有類型,并分配一個(gè)數(shù)據(jù)結(jié)構(gòu)記錄該類型,數(shù)據(jù)結(jié)構(gòu)為類型的每個(gè)方法分配一個(gè)對(duì)應(yīng)條目,記錄該方法實(shí)現(xiàn)代碼的地址;初始化該結(jié)構(gòu)時(shí),各方法被設(shè)置為CLR內(nèi)部的一個(gè)函數(shù)(未定義的函數(shù))
1) ??????? 第一次被執(zhí)行時(shí)
當(dāng)上述結(jié)構(gòu)中某函數(shù)被調(diào)用時(shí),JITComplier由該函數(shù)的類型及地址信息在程序集的元數(shù)據(jù)中找到其IL代碼的位置,把這些IL代碼驗(yàn)證并編譯成本地CPU指令這些CPU指令被保存在一個(gè)動(dòng)態(tài)分配的內(nèi)存中,而a)步驟中數(shù)據(jù)結(jié)構(gòu)中被調(diào)用方法的地址則被替換為包含本地CPU指令的地址。
2) ??????? 第二次被執(zhí)行時(shí)
若被調(diào)用的函數(shù)已經(jīng)被驗(yàn)證并編譯過(guò),則直接從內(nèi)存中調(diào)用之
若沒(méi)有被調(diào)用則重復(fù)第一次被執(zhí)行時(shí)的情況
3、 ? 性能
托管代碼可能比非托管代碼效率更好的理由:
l ???????? JIT編譯器可檢測(cè)到新型CPU并產(chǎn)生為這些CPU提供的特殊指令,以優(yōu)化執(zhí)行效率
l ???????? JIT編譯器可檢測(cè)到總是返回錯(cuò)誤的布爾測(cè)試,對(duì)于其所辦函的代碼段不產(chǎn)生CPU指令,以使得代碼量更小,執(zhí)行效率更高。
l ???????? CLR在運(yùn)行時(shí)有針對(duì)性地重新編譯某些IL代碼,重新組織以提高分支預(yù)測(cè)的成功率。
4、 ? NGen.exe提供折中方案,為IL代碼提供預(yù)編譯版本,以避免運(yùn)行時(shí)編譯。
5、 ? IL代碼驗(yàn)證:
--被驗(yàn)證為“不安全”的代碼將拋出System.Security.VerificationException異常
--代碼驗(yàn)證使得可以在一個(gè)windows進(jìn)程中可以運(yùn)行多個(gè) 托管應(yīng)用程序
更多的討論在 20
五、 .NET框架類庫(kù)(FCL)
CLR和FCL允許開發(fā)人員創(chuàng)建以下幾種應(yīng)用程序:
l ???????? XML Web服務(wù)
l ???????? Web窗體
l ???????? Windows窗體
l ???????? Windows控制臺(tái)應(yīng)用程序
l ???????? Window服務(wù)
l ???????? 組件庫(kù)
制作特定的應(yīng)用程序,關(guān)鍵是對(duì)相應(yīng)得FCL的熟悉,那么首先對(duì).NET Framework熟悉了吧。
六、 通用類型系統(tǒng)(Common Type System)
描述了CLR中類型的規(guī)范
類型的成員組成:
l ???????? 字段:表明對(duì)象的狀態(tài)
l ???????? 方法:用來(lái)改變狀態(tài)
l ???????? 屬性:提供對(duì)狀態(tài)訪問(wèn)時(shí)輸入?yún)?shù)驗(yàn)證、狀態(tài)有效性檢驗(yàn)及必要的求值運(yùn)算等功能
l ???????? 事件:對(duì)象間的通知機(jī)制
類型可見性和訪問(wèn)類型成員的一些規(guī)則:
l ???????? Private:只能被同一類型中的代碼訪問(wèn)
l ???????? Family:可以被派生類中的代碼調(diào)用,而不管是否位于同一個(gè)程序集中
l ???????? Family與Assembly:只能被位于同一個(gè)程序集中的派生類代碼調(diào)用
l ???????? Assembly:只能被同一個(gè)程序集中的代碼調(diào)用
l ???????? Family或Assembly:能被任何程序集中的派生類代碼調(diào)用,也可以被同一程序集中的任何類型調(diào)用
l ???????? Public:可被任何程序集中的任何代碼調(diào)用
七、 通用語(yǔ)言規(guī)范(Common Language Specification)
為使一種語(yǔ)言創(chuàng)建的類型能被其他語(yǔ)言無(wú)縫訪問(wèn),微軟定義了通用語(yǔ)言規(guī)范(CLS)。CLR/CTS支持的特性比CLS定義的豐富得多,實(shí)際上不同的語(yǔ)言實(shí)現(xiàn)了CLR/CTS特性的一個(gè)子集,而CLS則是所有語(yǔ)言特性的交集(一個(gè)最小特性集合)。
因此只有遵循CLS的類型才能被其他語(yǔ)言訪問(wèn)、應(yīng)用,C#中使用:
[assembly:CLSCompliant(true)]
迫使編譯器確保在公共導(dǎo)出類型中,剔除不符合CLS的部分。
八、 與非托管代碼互操作
為避免重新實(shí)現(xiàn)所有現(xiàn)有代碼,CLR被設(shè)計(jì)成包含托管部分和非托管部分,CLR支持三種互操作情形:
l ???????? 托管代碼調(diào)用DLL中的非托管函數(shù)
l ???????? 托管代碼使用現(xiàn)存的COM組件
l ???????? 非托管代碼使用托管類型
第七章 類型成員及其訪問(wèn)限定
一、類型成員的可能組成:
ü ???????? 常數(shù),總是靜態(tài)不可變的
ü ???????? 字段,分為靜態(tài)和實(shí)例字段兩種
ü ???????? 實(shí)例構(gòu)造器,初始化實(shí)例對(duì)象
ü ???????? 類型構(gòu)造器,初始化類型的靜態(tài)字段
ü ???????? 方法,分為靜態(tài)和實(shí)例方法兩種
ü ???????? 重載操作符,并非CLS的一部分,因?yàn)椴⒎撬姓Z(yǔ)言均支持之
ü ???????? 轉(zhuǎn)換操作符,不是CLS的一部分,部分語(yǔ)言不支持
ü ???????? 屬性,分靜態(tài)和實(shí)例屬性
ü ???????? 事件,分為靜態(tài)和實(shí)例事件兩種
ü ???????? 類型
二、訪問(wèn)限定修飾符:[ 僅列出c# 中的]
C# 術(shù)語(yǔ)
描述
private
僅可被所定義的類型(或其嵌套類型)訪問(wèn)
protected
僅可以被所定義的類型(或嵌套類型)或繼承的類型訪問(wèn)
Internal
僅可以被鎖定義的程序集訪問(wèn)
protected internal
僅可以被所定義的類型(或嵌套類型)、派生類型以及同一程序集訪問(wèn)
public
可被任何程序集的任何類型訪問(wèn)
注:1、默認(rèn)的訪問(wèn)方式為Internal
?????? 2 、只能選擇上述的一種修飾符,而不可同時(shí)指定兩個(gè)
三、類型預(yù)定義特性:
C# 術(shù)語(yǔ)
描述
abstract
不可被實(shí)例化,可用作基類型
sealed
不能用作基類型
注:不可同時(shí)使用上述限定符,可通過(guò)為sealed修飾的類型提供private構(gòu)造函數(shù)來(lái)達(dá)到“不可被實(shí)例化并不可被繼承”的目的
四、字段預(yù)定義特性:
C# 術(shù)語(yǔ)
描述
static
字段為 類型字段
readonly
僅可在構(gòu)造器中被賦值
注:關(guān)于常數(shù)和靜態(tài)只讀字段的區(qū)別,將在第八章詳述
五、方法預(yù)定義特性
C# 術(shù)語(yǔ)
描述
static
類型方法,不能訪問(wèn)實(shí)例字段或方法,只能訪問(wèn)類型方法或類型字段
默認(rèn)(CLR中稱為Instance)
實(shí)例方法,可以訪問(wèn)實(shí)例方法或字段,也可以訪問(wèn)類型方法或字段
virtual
多態(tài)的實(shí)現(xiàn),總調(diào)用繼承鏈最末端的實(shí)現(xiàn)
new
僅用于虛方法,隱藏基類型的方法實(shí)現(xiàn)
override
僅用于虛方法,顯示聲明重寫基類型方法
abstract
僅用于虛方法,派生類必須提供和該抽象方法匹配的實(shí)現(xiàn),含有抽象方法的類型為抽象類型
sealed
僅用于虛方法,派生類不能重寫該方法
注:sealed和abstract不能同時(shí)使用
第八章 常數(shù)與字段
一、常數(shù)
1、可被定義為常數(shù)的類型有:
2 基元類型:Boolean, Char, Byte, SByte, Decimal, Int16, Int32, UInt16, UInt32, Int64, UInt64, Single, Double
2 字符串:String
2 枚舉類型
2、常數(shù)在編譯后直接嵌入IL代碼中,因此一個(gè)模塊中的常數(shù)不能在運(yùn)行時(shí)被另一模塊獲取,前者對(duì)常數(shù)進(jìn)行的修改無(wú)法被另一個(gè)模塊在運(yùn)行時(shí)感知,因此要想在運(yùn)行時(shí)獲取“不變數(shù)值”應(yīng)該使用只讀字段
二、字段
1、字段(包括靜態(tài)、實(shí)例或只讀字段)均在運(yùn)行時(shí)分配內(nèi)存
2、只讀字段只能在構(gòu)造器中被符值(也可在聲明時(shí)被直接賦值,其他地方均不允許,實(shí)際上同于在構(gòu)造器中賦值),靜態(tài)只讀字段在類型構(gòu)造器中賦值,實(shí)例只讀字段在實(shí)例構(gòu)造器中被符值。
3、靜態(tài)只讀字段只能使用類型名訪問(wèn),而不能使用實(shí)例引用訪問(wèn)
三、靜態(tài)只讀字段和常數(shù)的區(qū)別:
1、常數(shù)直接編譯時(shí)刻嵌入IL代碼,在運(yùn)行時(shí)不可重新讀取,靜態(tài)只讀字段則可以在運(yùn)行時(shí)重新讀取
2、常數(shù)只能在聲明處賦值,而靜態(tài)只讀字段則可在構(gòu)造器中賦值
第九章 方法

一、 ???????????? 實(shí)例構(gòu)造器
1、 ? 前面提到用new操作符創(chuàng)建對(duì)象時(shí)的三部曲:
l ???????? 為對(duì)象分配內(nèi)存
l ???????? 初始化對(duì)象的附加成員(方法表指針和SyncBlockIndex)
l ???????? 調(diào)用實(shí)例構(gòu)造器初始化實(shí)例狀態(tài)
在分配內(nèi)存時(shí),系統(tǒng)將所有內(nèi)存位置均置為0值,這就是為什么字段初始化而未賦值時(shí)均為0或null值。
調(diào)用 實(shí)例構(gòu)造器的情況:
l ???????? 調(diào)用Object.MemberwiseClone()方法創(chuàng)建實(shí)例(分配內(nèi)存;初始化附加成員;將源對(duì)象字節(jié)拷貝到新創(chuàng)建的對(duì)象)
l ???????? 反序列化對(duì)象時(shí)
2、 ? 為避免為實(shí)例字段產(chǎn)生過(guò)多的構(gòu)造器代碼,應(yīng)避免在聲明字段時(shí)為字段符初值,而是在無(wú)參構(gòu)造器中為它們符初值,在其他重載的構(gòu)造器中調(diào)用無(wú)參構(gòu)造器。
3、 ? 值類型實(shí)例構(gòu)造器
l ???????? C#編譯器不會(huì)自動(dòng)調(diào)用其構(gòu)造器,必須顯式調(diào)用構(gòu)造器才能起作用
l ???????? C#編譯器不允許為值類型定義無(wú)參實(shí)例構(gòu)造器(下面會(huì)介紹可以定義無(wú)參類型構(gòu)造器)
l ???????? 不能為結(jié)構(gòu)中的字段在聲明的同時(shí)賦初值,可通過(guò)定義帶參構(gòu)造器的方式進(jìn)行
l ???????? 必須在結(jié)構(gòu)的構(gòu)造器中為所有字段賦初值
二、 ???????????? 類型構(gòu)造器
1、 ? 類型構(gòu)造器的一些限制:
l ???????? 不能帶任何參數(shù)
l ???????? 類型構(gòu)造器總為私有的,不能用其他訪問(wèn)修飾符
2、類型構(gòu)造器被調(diào)用的時(shí)機(jī):
l ???????? 第一個(gè)實(shí)例被創(chuàng)建,或者類型的第一個(gè)字段或成員第一次被訪問(wèn)之前
l ???????? 非繼承靜態(tài)字段被第一次訪問(wèn)之前
類型構(gòu)造器在類型的生命周期中只被調(diào)用一次;
3、一些限制:
l ???????? 若類型構(gòu)造器中拋出異常,則該類型變成不可訪問(wèn),訪問(wèn)其中的任何字段或方法均會(huì)拋出System.TypeInitializationException異常
l ???????? 類型構(gòu)造器只能訪問(wèn)類型的靜態(tài)字段
l ???????? 類型構(gòu)造器不應(yīng)該調(diào)用基類型的類型構(gòu)造器,因靜態(tài)字段并非繼承而是編譯時(shí)靜態(tài)綁定
三、 ???????????? 操作符重載
1、 ? 操作符重載
C#中對(duì)操作符重載的一些限制:
l ???????? 必須聲明為public static
l ???????? 必須有一個(gè)參數(shù)為操作符所屬類型
l ???????? 不能改變操作符原始定義的引數(shù)個(gè)數(shù)
l ???????? 若定義了true操作符也必須同時(shí)定義false操作符,二者都必須返回bool值
l ???????? ++、--操作符必須返回其所隸屬之類型的一個(gè)實(shí)例
l ???????? 可被重載的一元操作符:+、-、!、~、++、--、true、false
l ???????? 可被重載的二元操作符:+、-、*、/、%、!、^(異或)、<、>、<<、>>、==、!=、<=、>=
l ???????? 不允許被重載的操作符:&&、||、=、?:、+=、-=、/=、%=、|=、^=、<<=、>>=,實(shí)際上其中一些“復(fù)式操作符”在二元操作符被重載后自動(dòng)生成,而不能顯式定義
l ???????? 必須成對(duì)重載的操作符:(== ,!=)、(<,>)、(<=,>=)
l ???????? ++、--操作符重載時(shí)不能區(qū)分其為前置或后置的
2、 ? 操作符重載與語(yǔ)言互操作性
編譯器會(huì)為重載的操作符生成一個(gè)特殊名稱的方法,如+(加)操作符生成op_Addition()方法,并為該方法的定義條目上加上specialname標(biāo)記。當(dāng)某種語(yǔ)言不能進(jìn)行操作符重載時(shí),可以直接定義具有該特殊名稱的方法,以在其他語(yǔ)言中調(diào)用;或直接調(diào)用具有該特殊名稱的方法以適應(yīng)某種語(yǔ)言不能解析操作符的限制。如:vb中不能重載操作符,可顯式定義op_Addition()方法以在C#中調(diào)用;C#中定義的+操作符不能被VB識(shí)別,可顯式調(diào)用op_Addition()方法獲得同樣的功能。
四、 ???????????? 轉(zhuǎn)換操作符
轉(zhuǎn)換操作符的一些限制:
l ???????? 必須為public static
l ???????? 必須指定關(guān)鍵字implicit或explicit,原則為:從本類型轉(zhuǎn)換為其他類型使用implicit,將其他類型轉(zhuǎn)換為本類型用explicit,不能都使用implicit
五、 ???????????? 方法參數(shù)
1、 ? 引用參數(shù)
l ???????? 缺省情況下為值傳遞
l ???????? 標(biāo)志為out的參數(shù),在調(diào)用方法前 不必初始化,但返回之前必須賦值,沒(méi)有被初始化的參數(shù)是不能被使用
l ???????? 標(biāo)志為ref的參數(shù),在調(diào)用方法前 必須初始化,否則觸發(fā)編譯錯(cuò)誤
l ???????? 可以使用ref或out來(lái)進(jìn)行方法的重載,但不能通過(guò)區(qū)分ref和out來(lái)重載方法
l ???????? 按引用方式傳遞的變量(實(shí)參)必須和方法聲明的參數(shù)(形參)類型完全相同,否則觸發(fā)編譯錯(cuò)誤。
2、 ? 可變數(shù)目參數(shù)
使用params關(guān)鍵字及對(duì)象數(shù)組的方式指定可變參數(shù)序列。一些限制:
l ???????? 只有方法的最后一個(gè)參數(shù)才能使用可變數(shù)目參數(shù)
六、 ???????????? 虛方法
1、 ? 虛方法的調(diào)用機(jī)理
CLR使用以下兩個(gè)IL指令調(diào)用方法:
u ?????? call ? 根據(jù)類型(即引用的靜態(tài)類型、聲明類型)來(lái)調(diào)用一個(gè)方法
u ?????? callvirt ???? 根據(jù)對(duì)象(即引用的動(dòng)態(tài)類型、實(shí)際類型)來(lái)調(diào)用一個(gè)方法
對(duì)于虛方法使用call來(lái)調(diào)用的情況有:
l ???????? base.虛方法(),
l ???????? 密封類型引用虛方法,因?yàn)闆](méi)有必要檢驗(yàn)密封類型的實(shí)際類型
l ???????? 值類型,避免被裝箱
使用callvirt調(diào)用非虛方法的情況:
l ???????? 應(yīng)用變量為null時(shí),使用callvirt才會(huì)拋出System.NullReferenceException異常,而call不會(huì)拋出
無(wú)論call或callvirt調(diào)用方法,均會(huì)有一個(gè)隱含的this指針作為方法的第一個(gè)參數(shù),它指向正在操作的對(duì)象
2、 ? 虛方法的版本控制:
用下面的例子說(shuō)明:
using System;
class BaseClass
{
?????? public void NonVirtualFunc()
?????? {
????????????? Console.WriteLine("Non virtual func in base class");
?????? }
??????
?????? public virtual void VirtualFunc()
?????? {
????????????? Console.WriteLine("Virtual func in base class");??
?????? }
}
class DevicedClass : BaseClass
{
?????? // 若不使用new 關(guān)鍵字則編譯器會(huì)有warning:
?????? // “DevicedClass.NonVirtualFunc()”上要求關(guān)鍵字
?????? //new ,因?yàn)樗[藏了繼承成員“BaseClass.NonVirtualFunc()”
?????? public new void NonVirtualFunc()
?????? {
????????????? Console.WriteLine("Non virtual func in deviced class");?????
?????? }
?????? // 若不添加關(guān)鍵字override或new,則編譯器會(huì)有warning:
?????? // “DevicedClass.VirtualFunc()”將隱藏繼承的成員“BaseClass.VirtualFunc()
?????? // ”。若要使當(dāng)前成員重寫該實(shí)現(xiàn),請(qǐng)?zhí)砑雨P(guān)鍵字 override。否則,添加關(guān)鍵字
?????? //new
?????? public override void VirtualFunc()
?????? {
????????????? Console.WriteLine("Virtual func in deviced class");?????
?????? }
}
class TestClass
{
?????? public static void Main()
?????? {
????????????? // 派生類實(shí)例調(diào)用 非虛 及 虛函數(shù)
????????????? DevicedClass dc = new DevicedClass();
????????????? dc.NonVirtualFunc();
????????????? dc.VirtualFunc();
????????????? // 基類實(shí)例調(diào)用 非虛 及 虛函數(shù) ?????????????
????????????? BaseClass bc = new BaseClass();
????????????? bc.NonVirtualFunc();
????????????? bc.VirtualFunc();
?????????????
????????????? // 指向派生類實(shí)例的基類引用 調(diào)用 非虛 及 虛函數(shù)
????????????? BaseClass bc1 = dc;
????????????? bc1.NonVirtualFunc();
????????????? bc1.VirtualFunc();
?????? }
}
/*
在虛函數(shù)上使用關(guān)鍵字override的運(yùn)行結(jié)果:
Non virtual func in deviced class
Virtual func in deviced class
Non virtual func in base class
Virtual func in base class
Non virtual func in base class
Virtual func in deviced class
*/
/*
在虛函數(shù)上使用關(guān)鍵字new的運(yùn)行結(jié)果
Non virtual func in deviced class
Virtual func in deviced class
Non virtual func in base class
Virtual func in base class
Non virtual func in base class
Virtual func in base class
*/
由上可見:new 和 override在派生類中協(xié)調(diào)版本的控制,在第七章中已經(jīng)看到oeverride只能用于virtual方法,new則可用于非虛或虛方法,以實(shí)現(xiàn)隱藏基類中的同名方法。在虛函數(shù)上使用override,重寫了基類的方法,并無(wú)隱藏,這也就實(shí)現(xiàn)了多態(tài)。我們可設(shè)想這樣的結(jié)論: new 使用 call 指令調(diào)用靜態(tài)類型的方法,而 override 使用 callvirt 指令調(diào)用動(dòng)態(tài)類型的方法。
希望這個(gè)例子對(duì)您的理解有所幫助。
第十章 屬性
摘要:
本章討論C#中的 屬性 及 索引器
一、屬性
分為 靜態(tài)屬性、 實(shí)例 屬性和 屬性
l 避免 直接訪問(wèn)類型字段或使用煩瑣的 訪問(wèn)器 方法進(jìn)行訪問(wèn)
l 很好的實(shí)現(xiàn)了類型的 數(shù)據(jù)封裝,如:改變字段而維持屬性的意義對(duì)用戶是透明的
l 代碼量小,運(yùn)算量小的操作才使用屬性,否則使用方法調(diào)用更合適
二、索引器
l 可有多個(gè)重載的索引器,只要參數(shù)列表不同即可
l 可通過(guò)應(yīng)用System.Runtime.CompilerServices.IndexerNameAttribute特性改變編譯器為索引器生成的方法名(缺省使用get_Item(…),set_Item(...))
l 不能通過(guò)上述改變方法名的辦法來(lái)定義多個(gè)參數(shù)列相同而僅名稱不同的索引器
l 沒(méi)有所謂“靜態(tài)索引器”
注:在屬性或索引器中添加對(duì)參數(shù)或value值得判定有助于保證程序的完整性
一個(gè)簡(jiǎn)單的示例:
using System;
class IndexerTest
{
private static string[] strArr = new string[5];
IndexerTest()
{
for(int i = 0; i < 5; i ++)
{
strArr[i] = i.ToString();
}
}
public string this[Int32 nIndex]
{
get{
return strArr[nIndex];
}
set{
strArr[nIndex] = value;
}
}
// 提供不同的參數(shù)列進(jìn)行重載索引器
public string this[byte bIndex]
{
get{
return strArr[bIndex];
}
set{
strArr[bIndex] = (string)value;
}
}
// 只讀屬性
public string[] StrArr
{
get{
return strArr;
}
}
public static void Main()
{
IndexerTest it = new IndexerTest();
it[1] = "Hello"; // 利用索引器進(jìn)行寫操作
foreach(string str in it.StrArr)
{
Console.WriteLine(str);
}
}
}
<div style

《.net框架程序設(shè)計(jì)》學(xué)習(xí)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 九九九视频 | 国产欧美在线不卡 | 精品视频在线免费观看 | 日本一级成人毛片免费观看 | 九九精品视频一区在线 | 成 人 黄 色 视频 免费观看 | 亚洲综合激情另类图片专区 | 看一级毛片 | 99九九成人免费视频精品 | 国产91小视频在线观看 | 香香影院在线观看 | 精品综合久久久久97 | 亚洲欧洲国产经精品香蕉网 | 激情在线观看视频 | 精品一区久久 | 羞污影院 | 久久精品视屏 | 中文字幕第13亚洲另类 | 四虎最新网址在线观看 | 女人l8毛片a一级毛片 | 曰本女人一级毛片看一级毛 | 精品无人乱码一区二区三区 | 奇米影视奇米色777欧美 | 日韩免费一区二区三区 | 国内久久精品 | 久久中文字幕久久久久91 | 免费观看国产一区二区三区 | 天天草夜夜 | 欧美精品在线一区二区三区 | 欧美九九视频 | 国产成人免费手机在线观看视频 | www.好吊妞| 久久综合狠狠综合久久97色 | 色婷婷在线观看视频 | 日韩成a人片在线观看日本 日韩成人 | 国产精品久久久久一区二区三区 | 日本爱爱免费视频 | 免费观看黄色 | 久久国内精品自在自线观看 | 够爱久久 | 国内精品免费一区二区三区 |