乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      c#理論常識(shí)

       kittywei 2012-02-24

      目錄

      面向?qū)ο螅?/SPAN>... 2

      什么是封裝... 2

      什么是繼承... 2

      什么是多態(tài)... 3

      什么是耦合度... 3

      基本定義... 4

      泛型... 4

      抽象類、接口、基類、派生類、繼承... 4

      訪問類型的差異... 5

      枚舉... 6

      結(jié)構(gòu)和類... 7

      函數(shù)、方法... 9

      重構(gòu)、重寫、重載... 9

      事件和委托... 9

      簡(jiǎn)單的工廠模式開發(fā)... 10

      三層基本結(jié)構(gòu)... 11

      值類型和引用類型... 11

      附表... 12


      重新理解面向?qū)ο?,進(jìn)行新模式的思索和加深。

      <編程是技術(shù),也是藝術(shù),雖然我達(dá)不到藝術(shù)的巔峰,但可以努力向這個(gè)方向前進(jìn)>

      蔣玉龍 20084 進(jìn)行基礎(chǔ)知識(shí)的重溫

      QQ 66840199 EmailLoving-kiss@163.com

      面向?qū)ο螅?/SPAN>

      三大特性是封裝、繼承態(tài)而不再是簡(jiǎn)單的函數(shù)、方法

      個(gè)人理解面向?qū)ο笫且环N思想,如何成功的將業(yè)務(wù)邏輯界面邏輯分離,盡可能大的在維護(hù)、修改的時(shí)候改動(dòng)盡可能少的代碼(獨(dú)立出來(lái)單獨(dú)的功能塊而不需要改一而動(dòng)全身),降低程序的耦合度。最基礎(chǔ)的核心,應(yīng)該就是抽象,如何利用掌握的知識(shí),將事物的數(shù)學(xué)模型歸納好,這是一種思想,而不是一種簡(jiǎn)單的方式方法。面向?qū)ο筮€是過程,很重要么?不重要么?呵呵~~程序并不是實(shí)現(xiàn)了功能、界面美觀就是好程序,同樣,也不是使用了封裝、繼承和多態(tài)的就是面向?qū)ο蟆?/SPAN>

                  程序員應(yīng)該比操作員追求更高的一個(gè)目標(biāo)

      什么是封裝

      封裝 (encapsulation)

      隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開接口,控制在程序中屬性的讀和修改的訪問級(jí)別.

      封裝就是將抽象得到的數(shù)據(jù)和行為(或功能)相結(jié)合,形成一個(gè)有機(jī)的整體,也就是將數(shù)據(jù)與操作數(shù)據(jù)的源代碼進(jìn)行有機(jī)的結(jié)合,形成“類”,其中數(shù)據(jù)和函數(shù)都是類的成員。

      封裝的目的是增強(qiáng)安全性和簡(jiǎn)化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只是要通過 外部接口,一特定的訪問權(quán)限來(lái)使用類的成員。

      封裝的大致原則

      1把盡可能多的東西藏起來(lái).對(duì)外提供簡(jiǎn)捷的接口.

      2把所有的屬性藏起來(lái).

      例如,在抽象的基礎(chǔ)上,我們可以將時(shí)鐘的數(shù)據(jù)和功能封裝起來(lái),構(gòu)成一個(gè)時(shí)鐘類。

      c++的語(yǔ)法,時(shí)鐘類的聲明如下:

      class Clock

      {

      public:                    //共有成員,外部接口  

      void SetTime(int NewH,int NewM,int NewS);

      void ShowTime();

      private:                  //私有成員,外部無(wú)法訪問

      int Hour,Minute,Second;

      }

      可以看到通過封裝使一部分成員充當(dāng)類與外部的接口,而將其他的成員隱蔽起來(lái),這樣就達(dá)到了對(duì)成員訪問權(quán)限的合理控制,使不同類之間的相互影響減少到最低限度,進(jìn)而增強(qiáng)數(shù)據(jù)的安全性和簡(jiǎn)化程序的編寫工作。

      什么是繼承

          “繼承”是面向?qū)ο筌浖夹g(shù)當(dāng)中的一個(gè)概念,例如在java語(yǔ)言中,java語(yǔ)言中不支持多重繼承,是通過接口實(shí)現(xiàn)多重繼承的功能。如果一個(gè)類A繼承自另一個(gè)類B,就把這個(gè)A稱為"B的子類",而把B稱為"A的父類"。繼承可以使得子類具有父類的各種屬性和方法,而不需要再次編寫相同的代碼。在令子類繼承父類的同時(shí),可以重新定義某些屬性,并重寫某些方法,即覆蓋父類的原有屬性和方法,使其獲得與父類不同的功能。

           繼承是指一個(gè)對(duì)象直接使用另一對(duì)象的屬性和方法。事實(shí)上,我們遇到的很多實(shí)體都有繼承的含義。例如,若把汽車看成一個(gè)實(shí)體,它可以分成多個(gè)子實(shí)體,如:卡車、公共汽車等。這些子實(shí)體都具有汽車的特性,因此,汽車是它們的"父親",而這些子實(shí)體則是汽車的"孩子"。

      同類事物具有共同性,在同類事物中,每個(gè)事物又具有其特殊性。運(yùn)用抽象的原則舍棄對(duì)象的特殊性,抽取其共同性,則得到一個(gè)適應(yīng)于一批對(duì)象的類,這便是基類(父類),而把具有特殊性的類稱為派生類(子類),派生類的對(duì)象擁有其基類的全部或部分屬性與方法,稱作派生類對(duì)基類的繼承。

      什么是多態(tài)

      多態(tài),是面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言最核心的特征。多態(tài),意味著一個(gè)對(duì)象有著多重特征,可以在特定的情況下,表現(xiàn)不同的狀態(tài),從而對(duì)應(yīng)著不同的屬性和方法。從程序設(shè)計(jì)的角度而言,多態(tài)可以這樣來(lái)實(shí)現(xiàn)(以java語(yǔ)言為例):

      public interface Parent(){

      public void simpleCall();

      }

      public class Child_A implements Parent{

      public void simpleCall(){

      //具體的實(shí)現(xiàn)細(xì)節(jié);

      }

      }

      public class Child_B implements Parent{

      public void simpleCall(){

      //具體的實(shí)現(xiàn)細(xì)節(jié);

      }

      }

      //當(dāng)然還可以有其他的實(shí)現(xiàn)

      然后,我們就可以看到多態(tài)所展示的特性了:

      Parent pa = new Child_A();

      pa.simpleCall()則顯然是調(diào)用Child_A的方法;

      Parent pa = new Child_B();

      pa.simpleCall()則是在調(diào)用Child_B的方法。所以,我們對(duì)于抽象的父類或者接口給出了我們的具體實(shí)現(xiàn)后,pa 可以完全不用管實(shí)現(xiàn)的細(xì)節(jié),只訪問我們定義的方法,就可以了。事實(shí)上,這就是多態(tài)所起的作用,可以實(shí)現(xiàn)控制反轉(zhuǎn)這在大量的J2EE輕量級(jí)框架中被用到,比如Spring的依賴注射機(jī)制。

      什么是耦合度

      蔣:實(shí)際上不能也不必追求到完美的最低耦合度,在一定范圍內(nèi)降低,就足矣。

      軟件設(shè)計(jì)中通常用耦合度和內(nèi)聚度作為衡量模塊獨(dú)立程度的標(biāo)準(zhǔn)。劃分摸塊的一個(gè)準(zhǔn)則就是高內(nèi)聚低耦合。

      耦合度是指模塊之間聯(lián)系的緊密程度。耦合這個(gè)概念大家都很清楚,它的強(qiáng)弱直接影響軟件的維護(hù)和升級(jí)。耦合的強(qiáng)弱叫做耦合度。我們的軟件工程里面一個(gè)基本原則是高內(nèi)聚,低耦合。但是沒有耦合的系統(tǒng)是不存在的。因?yàn)楦鱾€(gè)模塊要互相輔助才能完成一個(gè)真正的系統(tǒng),所以現(xiàn)在好多說法是降低耦合,而沒有那種說取消耦合的說法了。

      模塊間的耦合度是指模塊之間的依賴關(guān)系,包括控制關(guān)系、調(diào)用關(guān)系、數(shù)據(jù)傳遞關(guān)系。模塊間聯(lián)系越多,其耦合性越強(qiáng),同時(shí)表明其獨(dú)立性越差。降低模塊間的耦合度能減少模塊間的影響,防止對(duì)某一模塊修改所引起的“牽一發(fā)動(dòng)全身”的水波效應(yīng),保證系統(tǒng)設(shè)計(jì)順利進(jìn)行。

      兩個(gè)模塊之間的耦合方式通??煞譃?/SPAN>7種,按其耦合度從低到高的次序依此為:非直接耦合、數(shù)據(jù)耦合、標(biāo)記耦合、控制耦合、外部耦合、公共耦合、內(nèi)容耦合。

      內(nèi)聚度是指內(nèi)部各元素之間聯(lián)系的緊密程度,模塊的內(nèi)聚種類通常可分為7種,按其內(nèi)聚度從低到高的次序依此為:偶然內(nèi)聚、邏輯內(nèi)聚、瞬時(shí)內(nèi)聚、過程內(nèi)聚、通信內(nèi)聚、順序內(nèi)聚、功能內(nèi)聚。

      基本定義

      泛型

      泛型使您可以按照泛型操作的精確的數(shù)據(jù)類型定制方法、類、結(jié)構(gòu)或接口。例如,您可以使用 Dictionary 泛型類并指定允許的鍵類型和允許的值類型,而不使用允許任何鍵類型和值類型的 Hashtable 類。泛型的優(yōu)點(diǎn)包括提高的代碼可重用性和類型安全性。(例程見附表)

      抽象類、接口、基類、派生類、繼承

      首先抽象類中有抽象成員和非抽象成員(和普通類成員一樣),而接口的所有成員都必須在實(shí)現(xiàn)接口的代碼類中實(shí)現(xiàn)。

      抽象類可以有自己的字段,但是接口不能有自己的字段,構(gòu)造函數(shù),析造函數(shù),靜態(tài)成員或常量。

      從用途上來(lái)說,抽象類主要是提供為對(duì)象系列的基類,共享一些主要特性,使繼承于一個(gè)抽象類的對(duì)象都具有一個(gè)共同的目的或者結(jié)構(gòu)。(所以我們可以把抽象類看成是對(duì)對(duì)象的一個(gè)特性)。接口主要是為一批類提供一些相同,而有必須實(shí)現(xiàn)的任務(wù)。實(shí)現(xiàn)同一個(gè)接口的一批類,就會(huì)強(qiáng)制的實(shí)現(xiàn)一些必須實(shí)現(xiàn)的接口成員,使編寫更規(guī)范。(所以我們可以把接口看成是對(duì)類的一個(gè)特性)。

      舉一個(gè)例子來(lái)看:

      膝上電腦和臺(tái)式電腦都可以由一個(gè)抽象類來(lái)派生,這個(gè)抽象類具有電腦的某些特性,比如內(nèi)存的型號(hào),大小,電源要求等。這些特性是和具體的對(duì)象有關(guān),我們需要從電腦來(lái)派生出我們自己的膝上電腦和臺(tái)式電腦類。但是無(wú)論是什么電腦他們都會(huì)有些相同的目的,比如編寫程序,拽寫文檔,打游戲等。我們可以為這些派生的類指定一個(gè)接口,以便他們都能實(shí)現(xiàn)這些相同目的的功能,例如游戲功能IgameInterface.

      A、   抽象類

      MustInherit編寫,不能被實(shí)例化

         Public MustInherit Class WashingMachine

      Sub New()

            ' Code to instantiate the class goes here.

         End sub

         Public MustOverride Sub Wash

         Public MustOverride Sub Rinse (loadSize as Integer)

      Public MustOverride Function Spin (speed as Integer) as Long

      End Class

      使用的時(shí)候,采用單繼承模式,而接口可以同時(shí)多個(gè)共存;

      B、   接口

      接口是其他類型為確保它們支持某些操作而實(shí)現(xiàn)的引用類型。接口從不直接創(chuàng)建而且沒有實(shí)際的表示形式,其他類型必須轉(zhuǎn)換為接口類型。

      一個(gè)接口定義一個(gè)協(xié)定。實(shí)現(xiàn)接口的類或結(jié)構(gòu)必須遵守其協(xié)定。接口可以包含方法、屬性、索引器和事件作為成員。.

      下面的示例顯示一個(gè)包含默認(rèn)屬性、事件 E、方法 F 和屬性 P 的接口:

      Interface IExample

         Default Property Item(index As Integer) As String

         Event E()

         Sub F(ByVal Value As Integer)

         Property P() As String

      End Interface

      接口可以使用多重繼承。

      C、    

      D、   抽象類和接口的區(qū)別

      1.類是對(duì)對(duì)象的抽象,可以把抽象類理解為把類當(dāng)作對(duì)象,抽象成的類          

      接口只是一個(gè)行為的規(guī)范或規(guī)定,微軟的自定義接口總是后帶able字段,證明其是表述一類類“我能做。。?!?/SPAN>

      抽象類更多的是定義在一系列緊密相關(guān)的類間,而接口大多數(shù)是關(guān)系疏松但都實(shí)現(xiàn)某一功能的類中    

      2.接口基本上不具備繼承的任何具體特點(diǎn),它僅僅承諾了能夠調(diào)用的方法;

      3.一個(gè)類一次可以實(shí)現(xiàn)若干個(gè)接口,但是只能擴(kuò)展一個(gè)父類 

      4.接口可以用于支持回調(diào),而繼承并不具備這個(gè)特點(diǎn).

      5.抽象類不能被密封。    

      6.抽象類實(shí)現(xiàn)的具體方法默認(rèn)為虛的,但實(shí)現(xiàn)接口的類中的接口方法卻默認(rèn)為非      虛的,當(dāng)然您也可以聲明為虛的。 

      7.(接口)與非抽象類類似,抽象類也必須為在該類的基類列表中列出的接口的所有成員提供它自己的實(shí)現(xiàn)。但是,允許抽象類將接口方法映射到抽象方法上。  

      8抽象類實(shí)現(xiàn)了oop中的一個(gè)原則,把可變的與不可變的分離。抽象類和接口就是定義為不可變的,而把可變的座位子類去實(shí)現(xiàn)。

      9.好的接口定義應(yīng)該是具有專一功能性的,而不是多功能的,否則造成接口污染。如果一個(gè)類只是實(shí)現(xiàn)了這個(gè)接口的中一個(gè)功能,而不得不去實(shí)現(xiàn)接口中的其他方法,就叫接口污染。  

      10.盡量避免使用繼承來(lái)實(shí)現(xiàn)組建功能,而是使用黑箱復(fù)用,即對(duì)象組合。因?yàn)槔^承的層次增多,造成最直接的后果就是當(dāng)你調(diào)用這個(gè)類群中某一類,就必須把他們?nèi)考虞d到棧中!后果可想而知.

      11.如果抽象類實(shí)現(xiàn)接口,則可以把接口中方法映射到抽象類中作為抽象方法而不必實(shí)現(xiàn),而在抽象類的子類中實(shí)現(xiàn)接口中方法    

      如果預(yù)計(jì)要?jiǎng)?chuàng)建組件的多個(gè)版本,則創(chuàng)建抽象類。抽象類提供簡(jiǎn)單的方法來(lái)控制組件版本。如果創(chuàng)建的功能將在大范圍的全異對(duì)象間使用,則使用接口。如果要設(shè)計(jì)小而簡(jiǎn)練的功能塊,則使用接口。如果要設(shè)計(jì)大的功能單元,則使用抽象類。      

      如果要在組件的所有實(shí)現(xiàn)間提供通用的已實(shí)現(xiàn)功能,則使用抽象類。

      訪問類型的差異

      Public可從以下位置訪問元素:同一項(xiàng)目中任意位置的代碼,引用該項(xiàng)目的其他項(xiàng)目,以及由該項(xiàng)目生成的任何程序集

      Friend可以從同一程序集內(nèi)部訪問元素,而不能從程序集外部訪問

      聲明上下文中的所有代碼均可以訪問其元素。編譯到同一程序集的其他類、結(jié)構(gòu)和模塊中的代碼可以訪問該程序集中的所有 Friend 元素

      Protected可以從同一個(gè)類內(nèi)部或從該類派生的類中訪問元素

      Protected Friend派生類同一程序集內(nèi)

      Private: 僅可以從同一模塊、類或結(jié)構(gòu)內(nèi)訪問元素

      A、  Overrides 重寫舊的方法[獲得原有方法只能用它]

      Overridable/virtual

      指定屬性或過程重寫從基類繼承的名稱相同的屬性或過程。

      B、   Overloads 增加新的方法,會(huì)有多個(gè)同名方法產(chǎn)生

      指定屬性或過程使用相同的名稱重新聲明一個(gè)或多個(gè)現(xiàn)有的屬性或過程。

      C、  Shadows  隱藏原有的方法

      指定已聲明的編程元素重新聲明并隱藏基類中的同名元素或重載元素集。

      枚舉

      Enum枚舉是一個(gè)指定的常數(shù),其基礎(chǔ)類型可以是除 Char 外的任何整型。如果沒有顯式聲明基礎(chǔ)類型,則使用 Int32。編程語(yǔ)言通常提供語(yǔ)法來(lái)聲明由一組已命名的常數(shù)和它們的值組成的枚舉。

                       提供比較此類的實(shí)例的方法、將實(shí)例的值轉(zhuǎn)換為其字符串表示形式的方法、將數(shù)字的字符串表示形式轉(zhuǎn)換為此類的實(shí)例的方法和創(chuàng)建指定枚舉和值的實(shí)例的方法。

      也可以將枚舉視為位域。有關(guān)更多信息,請(qǐng)參見 FlagsAttribute。

      此類從 ValueType 繼承,并實(shí)現(xiàn) IComparable、IFormattable IConvertible 接口。使用 Convert 類來(lái)進(jìn)行轉(zhuǎn)換,而不使用此類的 IConvertible 的顯式接口成員實(shí)現(xiàn)。

      用于 FlagsAttribute Enum 的準(zhǔn)則

      ·         只有要對(duì)數(shù)值執(zhí)行按位運(yùn)算(ANDOR、XOR)時(shí)才對(duì)枚舉使用 FlagsAttribute 自定義屬性。

      ·         2 的冪(即 1、24、8 等)定義枚舉常量。這意味著組合的枚舉常量中的各個(gè)標(biāo)志都不重疊。

      ·         請(qǐng)考慮為常用標(biāo)志組合創(chuàng)建一個(gè)枚舉常量。例如,如果有一個(gè)用于文件 I/O 操作的枚舉包含枚舉常量 Read = 1 Write = 2,請(qǐng)考慮創(chuàng)建枚舉常量 ReadWrite = Read OR Write,該枚舉常量將 Read Write 標(biāo)志組合在一起。此外,在某些情況下,可能會(huì)將用于組合標(biāo)志的按位 OR 運(yùn)算視為一種高級(jí)概念,在簡(jiǎn)單任務(wù)中不需要執(zhí)行此操作。

      ·         將負(fù)數(shù)定義為標(biāo)志枚舉常量時(shí)應(yīng)謹(jǐn)慎,因?yàn)楹芏鄻?biāo)志位置都可能設(shè)置為 1,這可能使您的代碼產(chǎn)生混淆并易于發(fā)生代碼錯(cuò)誤。

      ·         測(cè)試數(shù)值中是否已設(shè)置標(biāo)志的一種簡(jiǎn)便方法為:在數(shù)值和標(biāo)志枚舉常量之間執(zhí)行按位“與”操作,這種方法會(huì)將數(shù)值中與標(biāo)志不對(duì)應(yīng)的所有位都設(shè)置為零,然后測(cè)試該操作的結(jié)果是否等于該標(biāo)志枚舉常量。

      ·         None 用作值為零的標(biāo)志枚舉常量的名稱。在按位 AND 運(yùn)算中,不能使用 None 枚舉常量測(cè)試標(biāo)志,因?yàn)樗玫慕Y(jié)果始終為零。但是,您可以在數(shù)值與 None 枚舉常量之間執(zhí)行邏輯(不是按位)比較,以確定數(shù)值中是否已設(shè)置任何位。

      如果創(chuàng)建的是值枚舉而不是標(biāo)志枚舉,創(chuàng)建 None 枚舉常量仍十分有用。原因是在默認(rèn)情況下,公共語(yǔ)言運(yùn)行庫(kù)會(huì)將用于枚舉的內(nèi)存初始化為零。因此,如果不定義值為零的常量,則枚舉在創(chuàng)建時(shí)將包含非法值。

      如果明顯存在應(yīng)用程序需要表示的默認(rèn)情況,請(qǐng)考慮使用值為零的枚舉常量表示默認(rèn)值。如果不存在默認(rèn)情況,請(qǐng)考慮使用值為零的枚舉常量(這意味著該情況不由任何其他枚舉常量表示)。

      ·         不要定義只映射枚舉本身狀態(tài)的枚舉值。例如,不要定義只標(biāo)記枚舉末尾的枚舉常量。如果需要確定枚舉的最后一個(gè)值,請(qǐng)顯式檢查該值。此外,如果枚舉常量范圍中的所有值都有效,還可以對(duì)第一個(gè)和最后一個(gè)枚舉常量執(zhí)行范圍檢查。

      ·         不要指定保留供以后使用的枚舉常量。

      ·         在定義采用枚舉常量作為值的方法或?qū)傩詴r(shí),應(yīng)考慮對(duì)該值進(jìn)行驗(yàn)證。原因是即使數(shù)值未在枚舉中定義,也可以將數(shù)值強(qiáng)制轉(zhuǎn)換為枚舉類型。

       

      結(jié)構(gòu)和類

      一.類和結(jié)構(gòu)的示例比較:

      結(jié)構(gòu)示例:

      public struct Person

      {

      string Name;

      int height;

      int weight

      public bool overWeight()

      {

      //implement something

      }

      }

      類示例:

      public class TestTime

      {

      int hours;

      int minutes;

      int seconds;

       

      public void passtime()

      {

      //implementation of behavior

      }

      }

      調(diào)用過程:

      public class Test

      {

      public static ovid Main

      {

      Person Myperson=new Person //聲明結(jié)構(gòu)

      TestTime Mytime=New TestTime //聲明類

      }

      }

      從上面的例子中我們能夠看到,類的聲明和結(jié)構(gòu)的聲明很類似,只是限定符后面是 struct 還是 class 的區(qū)別,而且使用時(shí),定義新的結(jié)構(gòu)和定義新的類的方法也很類似。那么類和結(jié)構(gòu)的具體區(qū)別是什么呢?

      .類和結(jié)構(gòu)的差別

      1. 值類型和引用類型

      結(jié)構(gòu)是值類型:值類型在堆棧上分配地址,任何的基類型(基本類型,不是基類)都是結(jié)構(gòu)類型,例如:int 對(duì)應(yīng)System.int32 結(jié)構(gòu),通過使用結(jié)構(gòu)能夠創(chuàng)建更多的值類型

      類是引用類型:引用類型在堆上分配地址

      堆棧的執(zhí)行效率要比堆的執(zhí)行效率高,可是堆棧的資源有限,不適合處理大的邏輯復(fù)雜的對(duì)象。所以結(jié)構(gòu)處理作為基類型對(duì)待的小對(duì)象,而類處理某個(gè)商業(yè)邏輯

      因?yàn)榻Y(jié)構(gòu)是值類型所以結(jié)構(gòu)之間的賦值能夠創(chuàng)建新的結(jié)構(gòu),而類是引用類型,類之間的賦值只是復(fù)制引用

      注:

      1.雖然結(jié)構(gòu)和類的類型不相同,可是他們的基類型(基本類型,不是基類)都是對(duì)象(object,c#中任何類型的基類型都是object

      2.雖然結(jié)構(gòu)的初始化也使用了New 操作符可是結(jié)構(gòu)對(duì)象依然分配在堆棧上而不是堆上,假如不使用“新建”(new),那么在初始化任何字段之前,字段將保持未賦值狀態(tài),且對(duì)象不可用

      2.繼承性

      結(jié)構(gòu):不能從另外一個(gè)結(jié)構(gòu)或類繼承,本身也不能被繼承,雖然結(jié)構(gòu)沒有明確的用sealed聲明,可是結(jié)構(gòu)是隱式的sealed .

      類:完全可擴(kuò)展的,除非顯示的聲明sealed 否則類能夠繼承其他類和接口,自身也能被繼承

      注:雖然結(jié)構(gòu)不能被繼承 可是結(jié)構(gòu)能夠繼承接口,方法和類繼承接口相同

      例如:結(jié)構(gòu)實(shí)現(xiàn)接口

      interface IImage

       

      {

      void Paint();

      }

       

      struct Picture : IImage

      {

      public void Paint()

      {

      // painting code goes here

      }

      private int x, y, z; // other struct members

      }

       

      3.內(nèi)部結(jié)構(gòu):

      結(jié)構(gòu):

      沒有默認(rèn)的構(gòu)造函數(shù),但是能夠添加構(gòu)造函數(shù)

      沒有析構(gòu)函數(shù)

      沒有 abstract sealed(因?yàn)椴荒芾^承)

      不能有protected 修飾符

      能夠不使用new 初始化

      在結(jié)構(gòu)中初始化實(shí)例字段是錯(cuò)誤的

      類:

      有默認(rèn)的構(gòu)造函數(shù)

      有析構(gòu)函數(shù)

      能夠使用 abstract sealed

      protected 修飾符

      必須使用new 初始化

      三.如何選擇結(jié)構(gòu)還是類

      討論了結(jié)構(gòu)和類的相同之處和差別之后,下面討論如何選擇使用結(jié)構(gòu)還是類:

      1 堆棧的空間有限,對(duì)于大量的邏輯的對(duì)象,創(chuàng)建類要比創(chuàng)建結(jié)構(gòu)好一些

      2 結(jié)構(gòu)表示如點(diǎn)、矩形和顏色這樣的輕量對(duì)象,例如,假如聲明一個(gè)含有 1000 個(gè)點(diǎn)對(duì)象的數(shù)組,則將為引用每個(gè)對(duì)象分配附加的內(nèi)存。在此情況下,結(jié)構(gòu)的成本較低。

      3 在表現(xiàn)抽象和多級(jí)別的對(duì)象層次時(shí),類是最好的選擇

      4 大多數(shù)情況下該類型只是一些數(shù)據(jù)時(shí),結(jié)構(gòu)時(shí)最好的選擇

          第一,對(duì)于結(jié)構(gòu),不能聲明一個(gè)不帶參數(shù)的構(gòu)造函數(shù)

          不能自己聲明一個(gè)結(jié)構(gòu)的不帶參數(shù)的構(gòu)造函數(shù),原因是編譯器自動(dòng)生成了一個(gè)。在一個(gè)類中,如果自己不寫構(gòu)造函數(shù),那么編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的不帶參數(shù)的構(gòu)造函數(shù)。如果Time是類的話,那么它會(huì)正常編譯。但是因?yàn)?/SPAN>Time是一個(gè)結(jié)構(gòu),所以它會(huì)編譯失敗。

          與類相同,編譯器自動(dòng)給結(jié)構(gòu)生成的這個(gè)默認(rèn)的構(gòu)造函數(shù),將結(jié)構(gòu)中的變量(fields)默認(rèn)值都設(shè)置成0false、或者null。因此,應(yīng)當(dāng)確保默認(rèn)構(gòu)造函數(shù)建立的結(jié)構(gòu)值再行為上有邏輯而且默認(rèn)值有意義。假如不想使用默認(rèn)的值,可以通過寫一個(gè)非默認(rèn)的構(gòu)造函數(shù),即帶參數(shù)的構(gòu)造函數(shù),將參數(shù)初始化為其他值。但是需要注意的是,如果寫了一個(gè)帶參數(shù)的構(gòu)造函數(shù),就必須自己初始化所有的參數(shù),編譯器不會(huì)再為你初始化任何構(gòu)造函數(shù)里的參數(shù)。

          第二,在一個(gè)類里,可以在變量聲明的時(shí)候就初始化。但是,在結(jié)構(gòu)中這樣做是不行的。這樣做破壞了每一個(gè)結(jié)構(gòu)只能在其構(gòu)造函數(shù)中初始化它的變量的規(guī)則。

      函數(shù)、方法

      Function / Sub 基本常識(shí)

      重構(gòu)、重寫、重載

      重構(gòu):為了提高運(yùn)行效率,經(jīng)常要進(jìn)行程序模塊化,相同的模塊可以反復(fù)使用

      重寫:方法的重寫一定在不同的兩個(gè)類里面,而且必須寫在派生類里面

      重載:方法的重載有基于不同數(shù)量的參數(shù)方法的重載,還有基于不同類型的參數(shù)方法的重載,方法的重載是在同一個(gè)類里面。

      事件和委托

      蔣:個(gè)人感覺,委托實(shí)際上就相當(dāng)于一個(gè)事件的指針,用來(lái)傳遞、引用事件的一個(gè)東西。

      委托是可保存對(duì)方法的引用的類。與其他的類不同,委托類具有一個(gè)簽名,并且它只能對(duì)與其簽名匹配的方法進(jìn)行引用。這樣,委托就等效于一個(gè)類型安全函數(shù)指針或一個(gè)回調(diào)。雖然委托具有許多其他的用途,但這里只討論委托的事件處理功能。一個(gè)委托聲明足以定義一個(gè)委托類

      簡(jiǎn)單的工廠模式開發(fā)

      Operation oper;

      oper = OperationFactory.createOperate("+");                             引發(fā)運(yùn)算工廠類

      oper.NumberA = 1;

      oper.NumberB = 2;

      double result = oper.GetResult();                                                 返回結(jié)果

               /**//// <summary>

          /// 運(yùn)算類工廠

          /// </summary>

          class OperationFactory

          {

              public static Operation createOperate(string operate)

              {

                  Operation oper = null;

                  switch (operate)

                  {

                      case "+":

                          {

                              oper = new OperationAdd();

                              break;

                          }

                      case "-":

                          {

                              oper = new OperationSub();

                              break;

                          }

                      case "*":

                          {

                              oper = new OperationMul();

                              break;

                          }

                      case "/":

                          {

                              oper = new OperationDiv();

                              break;

                          }

                   }

       

                  return oper;

              }

      }

      大體分成三部分

      界面邏輯->運(yùn)算工廠->不同的運(yùn)算類

      詳見:戲說面向?qū)ο蟪绦蛟O(shè)計(jì)C#.pdf

      三層基本結(jié)構(gòu)

      蔣:以往一直認(rèn)為三層為界面層、應(yīng)用層、數(shù)據(jù)層,原來(lái)這是一個(gè)很大的誤區(qū)。

      實(shí)際上DBServer-WebServer-Client是物理意思上的三層架構(gòu),和程序的三層架構(gòu)沒有什么關(guān)系

      真正的三層是表現(xiàn)層(簡(jiǎn)稱UI)、業(yè)務(wù)邏輯層Business Logic Layer,簡(jiǎn)稱BLL層)和數(shù)據(jù)訪問數(shù)據(jù)訪問層(Data Access Layer,簡(jiǎn)稱DAL層)

       

      值類型和引用類型

      值類型:簡(jiǎn)單類型、結(jié)構(gòu)類型、枚舉類型

      引用類型:類、代表、數(shù)組、接口、String

      值類型:

      單元直接存放“有效值”

      如: int a=3;

      a內(nèi)存單元就放的是3

      引用類型:

      單元放的是另外一個(gè)對(duì)象的引用(地址)

      如: Form form1=new Form();

      就是說,在內(nèi)存中開辟了一個(gè)對(duì)象new Form(),form1內(nèi)存單元存放的是那個(gè)對(duì)象的地址,并非對(duì)象本身

      其中String 是具有值類型特點(diǎn)的引用類型;

      string是引用類型,但卻與其他引用類型有著一點(diǎn)差別。可以從以下兩個(gè)方面來(lái)看:

          1String類繼承自object類。而不是System.ValueType。

          2string本質(zhì)上是一個(gè)char[],而Array是引用類型,同樣是在托管的堆中分配內(nèi)存。

          String作為參數(shù)傳遞時(shí),卻有值類型的特點(diǎn),當(dāng)傳一個(gè)string類型的變量進(jìn)入方法內(nèi)部進(jìn)行處理后,當(dāng)離開方法后此變量的值并不會(huì)改變。原因是每次修改string的值時(shí),都會(huì)創(chuàng)建一個(gè)新的對(duì)象。

       

      區(qū)別

      A值類型和引用類型內(nèi)存分配

      值類型在棧上分配內(nèi)存,而引用類型在托管堆上分配內(nèi)存,卻只是一種籠統(tǒng)的說法。更詳細(xì)準(zhǔn)確地描述是:

      1、對(duì)于值類型的實(shí)例,如果做為方法中的局部變量,則被創(chuàng)建在線程棧上;如果該實(shí)例做為類型的成員,則作為類型成員的一部分,連同其他類型字段存放在托管堆上,

      2、引用類型的實(shí)例創(chuàng)建在托管堆上,如果其字節(jié)小于85000byte,則直接創(chuàng)建在托管堆上,否則創(chuàng)建在LOHLarge Objet Heal)上。

      B值類型和引用類型在傳遞參數(shù)時(shí)的影響

      C裝箱和拆箱

                  裝箱是將一個(gè)值類型轉(zhuǎn)換為一個(gè)對(duì)象類型(object),而拆箱則是將一個(gè)對(duì)象類型顯式轉(zhuǎn)換為一個(gè)值類型。對(duì)于裝箱而言,它是將被裝箱的值類型復(fù)制一個(gè)副本來(lái)轉(zhuǎn)換,而對(duì)于拆箱而言,需要注意類型的兼容性,比如,不能將一個(gè)值為“a”object類型轉(zhuǎn)換為int的類型。

       

      附表

      A、 泛型使用

      Public Class simpleList(Of itemType)

        Private items() As itemType

        Private top As Integer

        Private nextp As Integer

        Public Sub New()

          Me.New(9)

        End Sub

        Public Sub New(ByVal t As Integer)

          MyBase.New()

          items = New itemType(t) {}

          top = t

          nextp = 0

        End Sub

        Public Sub add(ByVal i As itemType)

          insert(i, nextp)

        End Sub

        Public Sub insert(ByVal i As itemType, ByVal p As Integer)

          If p > nextp OrElse p < 0 Then

            Throw New System.ArgumentOutOfRangeException("p", _

              " less than 0 or beyond next available list position")

          ElseIf nextp > top Then

            Throw New System.ArgumentException("No room to insert at ", _

              "p")

          ElseIf p < nextp Then

            For j As Integer = nextp To p + 1 Step -1

              items(j) = items(j - 1)

            Next j

          End If

          items(p) = i

          nextp += 1

        End Sub

        Public Sub remove(ByVal p As Integer)

          If p >= nextp OrElse p < 0 Then

              Throw New System.ArgumentOutOfRangeException("p", _

                  " less than 0 or beyond last list item")

          ElseIf nextp = 0 Then

              Throw New System.ArgumentException("List empty; cannot remove ", _

                  "p")

          ElseIf p < nextp - 1 Then

              For j As Integer = p To nextp - 2

                  items(j) = items(j + 1)

              Next j

          End If

          nextp -= 1

        End Sub

        Public ReadOnly Property listLength() As Integer

          Get

            Return nextp

          End Get

        End Property

        Public ReadOnly Property listItem(ByVal p As Integer) As itemType

          Get

            If p >= nextp OrElse p < 0 Then

              Throw New System.ArgumentOutOfRangeException("p", _

                " less than 0 or beyond last list item")

              End If

            Return items(p)

          End Get

        End Property

      End Class

       

      可以依據(jù) simpleList 聲明一個(gè)類來(lái)保存 Integer 值的列表,聲明另一個(gè)類來(lái)保存 String 值的列表,并再聲明一個(gè)類來(lái)保存 Date 值。除了列表成員的數(shù)據(jù)類型外,依據(jù)所有這些類創(chuàng)建的對(duì)象的工作方式都相同。

      使用代碼提供給 itemType 的類型變量可以是內(nèi)部類型(如 Boolean Double)、結(jié)構(gòu)、枚舉或任何類型的類(包括應(yīng)用程序定義的類)。

       

      可以使用以下代碼測(cè)試類 simpleList。

      Visual Basic  

      Public Sub useSimpleList()

        Dim iList As New simpleList(Of Integer)(2)

        Dim sList As New simpleList(Of String)(3)

        Dim dList As New simpleList(Of Date)(2)

        iList.add(10)

        iList.add(20)

        iList.add(30)

        sList.add("First")

        sList.add("extra")

        sList.add("Second")

        sList.add("Third")

        sList.remove(1)

        dList.add(#1/1/2003#)

        dList.add(#3/3/2003#)

        dList.insert(#2/2/2003#, 1)

        Dim s As String = _

          "Simple list of 3 Integer items (reported length " _

          & CStr(iList.listLength) & "):" _

          & vbCrLf & CStr(iList.listItem(0)) _

          & vbCrLf & CStr(iList.listItem(1)) _

          & vbCrLf & CStr(iList.listItem(2)) _

          & vbCrLf _

          & "Simple list of 4 - 1 String items (reported length " _

          & CStr(sList.listLength) & "):" _

          & vbCrLf & CStr(sList.listItem(0)) _

          & vbCrLf & CStr(sList.listItem(1)) _

          & vbCrLf & CStr(sList.listItem(2)) _

          & vbCrLf _

          & "Simple list of 2 + 1 Date items (reported length " _

          & CStr(dList.listLength) & "):" _

          & vbCrLf & CStr(dList.listItem(0)) _

          & vbCrLf & CStr(dList.listItem(1)) _

          & vbCrLf & CStr(dList.listItem(2))

        MsgBox(s)

      End Sub

      B、 其他

       

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多