欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      C#繪圖雙緩沖技術(shù)總結(jié)

      時(shí)間:2019-05-12 04:07:29下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《C#繪圖雙緩沖技術(shù)總結(jié)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《C#繪圖雙緩沖技術(shù)總結(jié)》。

      第一篇:C#繪圖雙緩沖技術(shù)總結(jié)

      C#繪圖雙緩沖技術(shù)總結(jié) GDI+的雙緩沖問(wèn)題

      一直以來(lái)的誤區(qū):.net1.1 和.net 2.0 在處理控件雙緩沖上是有區(qū)別的。.net 1.1 中,使用:this.SetStyle(ControlStyles.DoubleBuffer, true);.net 2.0中,使用:this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);VS2005 是2.0 怪不說(shuō)老是提示參數(shù)無(wú)效,一直也不知道是這個(gè)問(wèn)題,呵呵

      要知道,圖元無(wú)閃爍的實(shí)現(xiàn)和圖元的繪制方法沒(méi)有多少關(guān)系,只是繪制方法可以控制圖元的刷新區(qū)域,使雙緩沖性能更優(yōu)!

      導(dǎo)致畫(huà)面閃爍的關(guān)鍵原因分析:

      一、繪制窗口由于大小位臵狀態(tài)改變進(jìn)行重繪操作時(shí)

      繪圖窗口內(nèi)容或大小每改變一次,都要調(diào)用Paint事件進(jìn)行重繪操作,該操作會(huì)使畫(huà)面重新刷新一次以維持窗口正常顯示。刷新過(guò)程中會(huì)導(dǎo)致所有圖元重新繪制,而各個(gè)圖元的重繪操作并不會(huì)導(dǎo)致Paint事件發(fā)生,因此窗口的每一次刷新只會(huì)調(diào)用Paint事件一次。窗口刷新一次的過(guò)程中,每一個(gè)圖元的重繪都會(huì)立即顯示到窗口,因此整個(gè)窗口中,只要是圖元所在的位臵,都在刷新,而刷新的時(shí)間是有差別的,閃爍現(xiàn)象自然會(huì)出現(xiàn)。

      所以說(shuō),此時(shí)導(dǎo)致窗口閃爍現(xiàn)象的關(guān)鍵因素并不在于Paint事件調(diào)用的次數(shù)多少,而在于各個(gè)圖元的重繪。根據(jù)以上分析可知,當(dāng)圖元數(shù)目不多時(shí),窗口刷新的位臵也不多,窗口閃爍效果并不嚴(yán)重;當(dāng)圖元數(shù)目較多時(shí),繪圖窗口進(jìn)行重繪的圖元數(shù)量增加,繪圖窗口每一次刷新都會(huì)導(dǎo)致較多的圖元重新繪制,窗口的較多位臵都在刷新,閃爍現(xiàn)象自然就會(huì)越來(lái)越嚴(yán)重。特別是圖元比較大繪制時(shí)間比較長(zhǎng)時(shí),閃爍問(wèn)題會(huì)更加嚴(yán)重,因?yàn)闀r(shí)間延遲會(huì)更長(zhǎng)。

      解決上述問(wèn)題的關(guān)鍵在于:窗口刷新一次的過(guò)程中,讓所有圖元同時(shí)顯示到窗口。

      二、進(jìn)行鼠標(biāo)跟蹤繪制操作或者對(duì)圖元進(jìn)行變形操作時(shí)

      當(dāng)進(jìn)行鼠標(biāo)跟蹤繪制操作或者對(duì)圖元進(jìn)行變形操作時(shí),Paint事件會(huì)頻繁發(fā)生,這會(huì)使窗口的刷新次數(shù)大大增加。雖然窗口刷新一次的過(guò)程中所有圖元同時(shí)顯示到窗口,但也會(huì)有時(shí)間延遲,因?yàn)榇藭r(shí)窗口刷新的時(shí)間間隔遠(yuǎn)小于圖元每一次顯示到窗口所用的時(shí)間。因此閃爍現(xiàn)象并不能完全消除!

      所以說(shuō),此時(shí)導(dǎo)致窗口閃爍現(xiàn)象的關(guān)鍵因素在于Paint事件發(fā)生的次數(shù)多少。解決此問(wèn)題的關(guān)鍵在于:設(shè)臵窗體或控件的幾個(gè)關(guān)鍵屬性。

      下面來(lái)介紹解決辦法的具體細(xì)節(jié):

      解決雙緩沖的關(guān)鍵技術(shù):

      1、設(shè)臵顯示圖元控件的幾個(gè)屬性: 必須要設(shè)臵,否則效果不是很明顯!this.SetStyle(ControlStyles.OptimizedDoubleBuffer |

      ControlStyles.ResizeRedraw |

      ControlStyles.AllPaintingInWmPaint, true);

      2、窗口刷新一次的過(guò)程中,讓所有圖元同時(shí)顯示到窗口。

      可以通過(guò)以下幾種方式實(shí)現(xiàn),這幾種方式都涉及到Graphics對(duì)象的創(chuàng)建方式。

      Graphics對(duì)象的創(chuàng)建方式:

      a、在內(nèi)存上創(chuàng)建一塊和顯示控件相同大小的畫(huà)布,在這塊畫(huà)布上創(chuàng)建Graphics對(duì)象。

      接著所有的圖元都在這塊畫(huà)布上繪制,繪制完成以后再使用該畫(huà)布覆蓋顯示控件的背景,從而達(dá)到“顯示一次僅刷新一次”的效果!

      實(shí)現(xiàn)代碼(在OnPaint方法中): Rectangle rect = e.ClipRectangle;Bitmap bufferimage = new Bitmap(this.Width, this.Height);Graphics g = Graphics.FromImage(bufferimage);g.Clear(this.BackColor);g.SmoothingMode = SmoothingMode.HighQuality;//高質(zhì)量 g.PixelOffsetMode = PixelOffsetMode.HighQuality;//高像素偏移質(zhì)量 foreach(IShape drawobject in doc.drawObjectList){ if(rect.IntersectsWith(drawobject.Rect)){ drawobject.Draw(g);if(drawobject.TrackerState == config.Module.Core.TrackerState.Selected

      && this.CurrentOperator == Enum.Operator.Transfrom)//僅當(dāng)編輯節(jié)點(diǎn)操作時(shí)顯示圖元熱點(diǎn)

      { drawobject.DrawTracker(g);} } } using(Graphics tg = e.Graphics){ tg.DrawImage(bufferimage, 0, 0);//把畫(huà)布貼到畫(huà)面上 }

      b、直接在內(nèi)存上創(chuàng)建Graphics對(duì)象: Rectangle rect = e.ClipRectangle;BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;BufferedGraphics myBuffer = currentContext.Allocate(e.Graphics, e.ClipRectangle);Graphics g = myBuffer.Graphics;g.SmoothingMode = SmoothingMode.HighQuality;g.PixelOffsetMode = PixelOffsetMode.HighSpeed;g.Clear(this.BackColor);foreach(IShape drawobject in doc.drawObjectList){ if(rect.IntersectsWith(drawobject.Rect)){ drawobject.Draw(g);if(drawobject.TrackerState == config.Module.Core.TrackerState.Selected && this.CurrentOperator == Enum.Operator.Transfrom)//僅當(dāng)編輯節(jié)點(diǎn)操作時(shí)顯示圖元熱點(diǎn)

      { drawobject.DrawTracker(g);} } } myBuffer.Render(e.Graphics);g.Dispose();myBuffer.Dispose();//釋放資源

      至此,雙緩沖問(wèn)題解決,兩種方式的實(shí)現(xiàn)效果都一樣,但最后一種方式的占有的內(nèi)存很少,不會(huì)出現(xiàn)內(nèi)存泄露!

      手工設(shè)臵雙緩沖.netframework提供了一個(gè)類(lèi)BufferedGraphicsContext負(fù)責(zé)單獨(dú)分配和管理圖形緩沖區(qū)。每個(gè)應(yīng)用程序域都有自己的默認(rèn) BufferedGraphicsContext 實(shí)例來(lái)管理此應(yīng)用程序的所有默認(rèn)雙緩沖。大多數(shù)情況下,每個(gè)應(yīng)用程序只有一個(gè)應(yīng)用程序域,所以每個(gè)應(yīng)用程序通常只有一個(gè)默認(rèn)

      BufferedGraphicsContext。默認(rèn) BufferedGraphicsContext 實(shí)例由 BufferedGraphicsManager 類(lèi)管理。通過(guò)管理BufferedGraphicsContext實(shí)現(xiàn)雙緩沖的步驟如下:

      (1)獲得對(duì) BufferedGraphicsContext 類(lèi)的實(shí)例的引用。(2)通過(guò)調(diào)用 BufferedGraphicsContext.Allocate 方法創(chuàng)建 BufferedGraphics 類(lèi)的實(shí)例。

      (3)通過(guò)設(shè)臵 BufferedGraphics.Graphics 屬性將圖形繪制到圖形緩沖區(qū)。(4)當(dāng)完成所有圖形緩沖區(qū)中的繪制操作時(shí),可調(diào)用

      BufferedGraphics.Render 方法將緩沖區(qū)的內(nèi)容呈現(xiàn)到與該緩沖區(qū)關(guān)聯(lián)的繪圖圖面或者指定的繪圖圖面。

      (5)完成呈現(xiàn)圖形之后,對(duì) BufferedGraphics 實(shí)例調(diào)用釋放系統(tǒng)資源的 Dispose 方法。dataGridView 閃爍 和 listview 閃爍 的解決辦法。

      -----------------------DataGridView

      ///

      ///雙緩沖DataGridView,解決閃爍 /// class DoubleBufferDataGridView : DataGridView { public DoubleBuffeDataGridView(){ SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);UpdateStyles();} } 然后在DataGridView所在窗體的InitializeComponent方法中,更改控件類(lèi)型實(shí)例化語(yǔ)句為:

      //this.dataGridView1 = new System.Windows.Forms.DataGridView();(屏蔽掉)this.dataGridView1 = new DoubleBufferDataGridView();-----------------------ListView------///

      ///雙緩沖ListView,解決閃爍 /// class DoubleBufferListView : ListView { public DoubleBufferListView(){ SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);UpdateStyles();} } 然后在ListView 所在窗體的InitializeComponent方法中,更改控件類(lèi)型實(shí)例化語(yǔ)句為:

      //this.listView1 = new System.Windows.Forms.ListView();(屏蔽掉)this.listView1 = new DoubleBufferListView();

      foreach

      foreach 語(yǔ)句為數(shù)組或?qū)ο蠹现械拿總€(gè)元素重復(fù)一個(gè)嵌入語(yǔ)句組。foreach 語(yǔ)句用于循環(huán)訪問(wèn)集合以獲取所需信息,但不應(yīng)用于更改集合內(nèi)容以避免產(chǎn)生不可預(yù)知的副作用。此語(yǔ)句的形式如下:

      foreach(type identifier in expression)statement

      其中:

      type

      identifier 的類(lèi)型。

      identifier

      表示集合元素的迭代變量。如果迭代變量為值類(lèi)型,則無(wú)法修改的只讀變量也是有效的。

      expression

      對(duì)象集合或數(shù)組表達(dá)式。集合元素的類(lèi)型必須可以轉(zhuǎn)換為 identifier 類(lèi)型。請(qǐng)不要使用計(jì)算為 null 的表達(dá)式。

      而應(yīng)計(jì)算為實(shí)現(xiàn) IEnumerable 的類(lèi)型或聲明 GetEnumerator 方法的類(lèi)型。在后一種情況中,GetEnumerator 應(yīng)該要么返回實(shí)現(xiàn) IEnumerator 的類(lèi)型,要么聲明 IEnumerator 中定義的所有方法。

      statement

      要執(zhí)行的嵌入語(yǔ)句。

      事例:

      int[] arr = new int[] { 0, 1, 2, 3, 4 };

      foreach(int i in arr)

      {

      Console.Write(i);

      }

      C#中foreach語(yǔ)法

      int[] arr={1,2,3};

      foreach(int i in arr)

      {

      System.Console.WriteLine(i);

      }

      php中foreach語(yǔ)法

      $arr=array(1,2,3,4,'a','b',“c”);

      1.foreach($arr as $v)

      {

      echo $v.“ ”;

      }

      2.foreach($arr2 as $k=>$v)

      {

      echo “[$k]=>$v
      ”;

      }

      java中foreach語(yǔ)法

      格式:

      for(元素類(lèi)型type 元素變量x : 遍歷對(duì)象obj)

      {

      引用了x的java語(yǔ)句;

      }

      Example:

      public class Test {

      public static void main(String[] args)

      {

      int[] a = {1,2,3};

      for(int i : a)

      System.out.print(i + “ ”);

      }

      }

      第二篇:C#總結(jié)

      引用類(lèi)型是類(lèi)型安全的指針,它們的內(nèi)存是分配在堆(保存指針地址)上的。String、數(shù)組、類(lèi)、接口和委托都是引用類(lèi)型。

      強(qiáng)制類(lèi)型轉(zhuǎn)換與as類(lèi)型轉(zhuǎn)換的區(qū)別:當(dāng)類(lèi)型轉(zhuǎn)換非法時(shí),強(qiáng)制類(lèi)型轉(zhuǎn)換將拋出一System.InvalidCastException異常,而as不會(huì)拋出異常,它返回一個(gè)null值。用using創(chuàng)建別名:using console = System.Console;訪問(wèn)限定符:

      public 該成員可以被其他任何類(lèi)訪問(wèn) protected 該成員只能被其派生類(lèi)訪問(wèn)

      private 該成員只能被本類(lèi)的其他成員訪問(wèn) internal 該成員只能在當(dāng)前編譯單元的其他成員訪問(wèn) 帶參數(shù)列表和返回值的Main方法: class Test {

      public static int Main(string[] args)

      {

      foreach(string arg in args)

      {

      ...}

      } } 構(gòu)造函數(shù)(constructor)包括實(shí)例構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)。構(gòu)造函數(shù)與類(lèi)名相同,且不能有返回值。例:

      class TestClass {

      TestClass()//實(shí)例構(gòu)造函數(shù):可以訪問(wèn)靜態(tài)成員和實(shí)例成員,用于初始化實(shí)例成員

      {

      ...}

      static TestClass()//靜態(tài)構(gòu)造函數(shù):只能訪問(wèn)靜態(tài)成員,用于初始化靜態(tài)成員

      {

      ...} } 類(lèi)的靜態(tài)成員屬于類(lèi)所有,不必生成實(shí)例就可以訪問(wèn),它是在載入包含類(lèi)的應(yīng)用程序時(shí)創(chuàng)建的,但靜態(tài)方法不能訪問(wèn)類(lèi)的實(shí)例變量和方法。通常,靜態(tài)變量是在定義時(shí)就賦初始值的。類(lèi)的實(shí)例成員屬于類(lèi)的實(shí)例所有,不創(chuàng)建實(shí)例對(duì)象就無(wú)法對(duì)其進(jìn)行訪問(wèn),實(shí)例成員可以訪問(wèn)類(lèi)的

      靜態(tài)成員和其它實(shí)例成員。調(diào)用基類(lèi)的析構(gòu)函數(shù): class A {

      public A()

      {

      ...} } class B {

      public B(): base()//調(diào)用基類(lèi)的析構(gòu)函數(shù)

      {

      ...} } 常量:其值是在編譯時(shí)設(shè)定的,必須是數(shù)值文字。默認(rèn)狀態(tài)下常量是靜態(tài)的。例: class A {

      public const double pi = 3.1415;} 常量是編譯時(shí)就確定的值,只讀字段是在運(yùn)行才能確定的值。比如運(yùn)行時(shí)才能確定的屏幕分辨率。

      只讀字段只能在類(lèi)的析構(gòu)函數(shù)中賦值。靜態(tài)只讀字段: class A {

      public static readonly int ScreenWidth;//靜態(tài)只讀字段

      static A()

      //靜態(tài)析構(gòu)函數(shù)

      {

      ScreenWidth = 1024;//在靜態(tài)析構(gòu)函數(shù)中初始化

      } } 在類(lèi)的繼承中,類(lèi)的析構(gòu)函數(shù)是不會(huì)被繼承的。一個(gè)派生類(lèi)只能從一個(gè)基類(lèi)繼承,不能同時(shí)從多個(gè)基類(lèi)繼承,但可以通過(guò)繼承多個(gè)接口來(lái)達(dá)到相同目的。實(shí)現(xiàn)多繼承的唯一方法就是使用接口。例:

      class MyFancyGrid: Control, ISerializable, IDataBound {...} 密封類(lèi)是不能繼承的類(lèi),抽象類(lèi)不能被定義為密封類(lèi),且密封類(lèi)的私有成員不能用protected修飾,只能用private。例: sealed class A {...} 關(guān)鍵字ref和out用于指定用引用方式傳遞方法的參數(shù)。

      它們的區(qū)別是:ref參數(shù)必須初始化,而out參數(shù)不需要初始化。所以在方法處理代碼依賴(lài)參數(shù)的初始化值時(shí)使用ref,不依賴(lài)初始化值時(shí)使用out。對(duì)out參數(shù)即使在傳遞前對(duì)其進(jìn)行了初始化,其值也不會(huì)傳遞到方法處理函數(shù)內(nèi)部。傳遞時(shí)系統(tǒng)會(huì)將其設(shè)為未初始化。所以在方法內(nèi)部必須對(duì)out參數(shù)進(jìn)行初始化。

      方法重載時(shí),必須參數(shù)數(shù)目和參數(shù)類(lèi)型其中之一不同,返回值不同不能作為重載。C#不支持方法的默認(rèn)值,只能通過(guò)方法重載來(lái)實(shí)現(xiàn)。例: class A {

      int Method(int a)

      {

      ...}

      void Method(int a, int b)//參數(shù)數(shù)目不同

      {

      //返回值不同不能作為重載

      ...} } params參數(shù)用于一個(gè)不定數(shù)目參數(shù)的方法,一般后面跟一個(gè)數(shù)組。例: class A {

      public void Method(params int[] i)

      {

      ...} } 方法的覆蓋:指派生類(lèi)覆蓋基類(lèi)的同名方法,有二種方法

      1)第一種是在派生類(lèi)要覆蓋的方法前面加new修飾,而基類(lèi)不需要作任何改動(dòng)。這種方法的缺點(diǎn)是不能實(shí)現(xiàn)多態(tài)。例: class A {

      public void Method()//無(wú)需任何修飾

      {

      ...} } class B: A

      //從基類(lèi)繼承

      {

      new public void Method()//覆蓋基類(lèi)的同名方法

      {

      ...} } class TestClass {

      A Instance = new B();

      Instance.Method();//這時(shí)將調(diào)用類(lèi)A的Method方法,而不是類(lèi)B的Method方法 } 2)第二種是在派生類(lèi)要覆蓋的方法前面加override修飾,而基類(lèi)的同名方法前面加virtual修飾。這樣就能實(shí)現(xiàn)多態(tài),例: class A {

      virtual public void Method()

      //基類(lèi)定義虛方法

      {

      //虛擬方法不能定義為private,因?yàn)閜rivate成員對(duì)派生類(lèi)是無(wú)法訪問(wèn)的...} }

      class B: A

      //從基類(lèi)繼承 {

      override public void Method()

      //派生類(lèi)覆蓋基類(lèi)的同名虛方法

      {

      ...} } class TestClass {

      protected void Test()

      {

      A Instance = new B();

      //定義一個(gè)實(shí)例,類(lèi)型為基類(lèi),從派生類(lèi)創(chuàng)建

      //派生類(lèi)總是能夠向上轉(zhuǎn)換為其基類(lèi)

      Instance.Method();

      //將調(diào)用派生類(lèi)B的Method方法,而不是基類(lèi)的,這就是多態(tài)

      } } 說(shuō)明:new修飾的方法覆蓋不能實(shí)現(xiàn)多態(tài)的原因,是因?yàn)槭褂胣ew時(shí)編譯器只會(huì)實(shí)現(xiàn)早期綁定(early binding)。即調(diào)用的方法在編譯時(shí)就決定了:編譯器看到Instance.Method()而Instance的類(lèi)是A,就會(huì)調(diào)用類(lèi)A的Method()方法。

      override修飾的方法覆蓋可以實(shí)現(xiàn)多態(tài)的原因,是因?yàn)閷?shí)現(xiàn)了后期綁定(late binding)。使用override時(shí)強(qiáng)制編譯器在運(yùn)行時(shí)根據(jù)類(lèi)的真正類(lèi)型正確調(diào)用相應(yīng)的方法,而不是在編譯時(shí)。

      而基類(lèi)的同名方法必須加virtual修飾。

      類(lèi)的靜態(tài)方法可能通過(guò) 類(lèi)名.靜態(tài)方法名 這種格式來(lái)調(diào)用,不能使用 實(shí)例名.靜態(tài)方法名 這種方法調(diào)用。

      因?yàn)轭?lèi)的靜態(tài)方法為類(lèi)所有(是屬于類(lèi)本身的),而非實(shí)例所有(不是屬于類(lèi)的實(shí)例的)。類(lèi)的靜態(tài)方法可以訪問(wèn)類(lèi)的任何靜態(tài)成員,但不能訪問(wèn)類(lèi)的實(shí)例成員。C#中類(lèi)的變量稱(chēng)為字段。類(lèi)的public變量稱(chēng)為類(lèi)的公共字段。

      類(lèi)的屬性由一個(gè)protected(也可以是private)字段和getter和setter方法構(gòu)成: class Address {

      protected string zipCode;//protected字段,注意大小寫(xiě)

      public string ZipCode

      {

      get

      //getter方法

      {

      return zipCode;

      }

      set

      //setter方法

      {

      zipCode = value;//被傳遞的值自動(dòng)被在這個(gè)value變量中

      }

      };} 只讀屬性是指省略setter方法的屬性,只讀屬性只能讀取,不能設(shè)置。

      屬性也可以用限定符virtual,override和abstract修飾,功能同其他類(lèi)的方法。

      屬性有一個(gè)用處稱(chēng)為懶惰的初始化(lazy initialization)。即在需要類(lèi)成員時(shí)才對(duì)它們進(jìn)行初始化。如果類(lèi)中包含了很少被引用的成員,而這些成員的初始化又會(huì)花費(fèi)大量的時(shí)候和系統(tǒng)資源的話,懶惰的初始化就很有用了。C#中數(shù)組對(duì)象共同的基類(lèi)是System.Array。將數(shù)組聲明為類(lèi)的一個(gè)成員時(shí),聲明數(shù)組與實(shí)例化數(shù)組必須分開(kāi),這是因?yàn)橹荒茉谶\(yùn)行時(shí)創(chuàng)建了類(lèi)的實(shí)例對(duì)象之后,才能實(shí)例化數(shù)組元素值。聲明:

      int[] intArray;//一維數(shù)組 int[,] int3Array;//三維數(shù)組 初始化:

      intArray = new int[3] {1,2,3};int[,] int2Array = new int[2,3] {{1,2,3},{4,5,6}};//聲明時(shí)可以初始化 遍歷:

      1)一維數(shù)組

      for(int i = 0;i < intArray.Length;i++);//Array.Length返回?cái)?shù)組所有元素的個(gè)數(shù) foreach(int i in intArray);for(int i = 0;i < intArray.GetLength(0);i++);//Array.GetLength(0)返回?cái)?shù)組第一維的個(gè)數(shù) 2)多維數(shù)組

      for(int i = 0;i < int3Array.GetLength(0);i++)//遍歷三維數(shù)組

      for(int j = 0;j < int3Array.GetLength(1);j++)

      for(int k = 0;k < int3Array.GetLength(2);k++)

      {

      ...} 數(shù)組的維數(shù)就是該數(shù)組的秩(Rank)。Array.Rank可以返回?cái)?shù)據(jù)的秩。鋸齒數(shù)組(jagged Array)是元素為數(shù)組的數(shù)組,例:

      int[][] jaggedArray = new int[2][];//包含二個(gè)元素,每個(gè)元素是個(gè)數(shù)組 jaggedArray[0] = new int[2];//每個(gè)元素必須初始化 jaggedArray[1] = new int[3];for(int i = 0;i < jaggedArray.Length;i++)//遍歷鋸齒數(shù)組

      for(int j = 0;j < jaggedArray[i].Length;j++)

      {

      ...} 類(lèi)的屬性稱(chēng)為智能字段,類(lèi)的索引器稱(chēng)為智能數(shù)組。由于類(lèi)本身作數(shù)組使用,所以用this作索引器的名稱(chēng),索引器有索引參數(shù)值。例: using System;using System.Collections;class MyListBox {

      protected ArrayList data = new ArrayList();

      public object this[int idx] //this作索引器名稱(chēng),idx是索引參數(shù)

      {

      get

      {

      if(idx >-1 && idx < data.Count)

      {

      return data[idx];

      }

      else

      {

      return null;

      }

      }

      set

      {

      if(idx >-1 && idx < data.Count)

      {

      data[idx] = value;

      }

      else if(idx = data.Count)

      {

      data.Add(value);

      }

      else

      {

      //拋出一個(gè)異常

      }

      }

      } } 接口是二段不同代碼之間約定,通過(guò)約定實(shí)現(xiàn)彼此之間的相互訪問(wèn)。C#并不支持多繼承,但通過(guò)接口可實(shí)現(xiàn)相同功能。當(dāng)在接口中指定了實(shí)現(xiàn)這個(gè)接口的類(lèi)時(shí),我們就稱(chēng)這個(gè)類(lèi)“實(shí)現(xiàn)了該接口”或“從接口繼承”。一個(gè)接口基本上就是一個(gè)抽象類(lèi),這個(gè)抽象類(lèi)中除了聲明C#類(lèi)的其他成員類(lèi)型——例如屬性、事件和索引器之外,只聲明了純虛擬方法。接口中可以包含方法、屬性、索引器和事件——其中任何一種都不是在接口自身中來(lái)實(shí)現(xiàn)的。例:

      interface IExampleInterface {

      //property declaration

      int testProperty { get;}

      //event declaration

      event testEvevnt Changed;

      //mothed declaration

      function void testMothed();

      //indexer declaration

      string this[int index] { get;set;} } 說(shuō)明:定義接口時(shí),在方法、屬性、事件和索引器所有這些接口成員都不能用public之類(lèi)的訪問(wèn)限定符,因?yàn)樗薪涌诔蓡T都是public類(lèi)型的。因?yàn)榻涌诙x了一個(gè)約定,任何實(shí)現(xiàn)一個(gè)接口的類(lèi)都必須定義那個(gè)接口中每一個(gè)成員,否則將編譯失敗。例: using System;public class FancyControl {

      protected string data;

      public string Data

      {

      get {return this.data;}

      set {data = value;}

      } } interface IValidate {

      bool Validate();//接口方法

      } public class MyControl: FancyControl, IValidate {

      public MyControl()

      {

      data = “my control data”;

      }

      public bool Validate()//實(shí)現(xiàn)接口

      {

      if(data == “my control data”)

      return true;

      else

      return false;

      } } class InterfaceApp {

      MyControl myControl = new MyControl();

      IValidate val =(IValidate)myControl;//可以將一個(gè)實(shí)現(xiàn)某接口的類(lèi),轉(zhuǎn)換成該接口

      bool success = val.Validate();//然后可調(diào)用該接口的方法 } 也可以用:bool success = myControl.Validate();這種方法來(lái)調(diào)用Validate方法,因?yàn)閂alidate在類(lèi)MyControl中是被定義成public的,如果去除public,Validate方法被隱藏,就不能用這種方法調(diào)用了,這樣隱藏接口方法稱(chēng)為名字隱藏(name hiding)??梢杂茫侯?lèi)實(shí)例 is 接口名 來(lái)判斷某個(gè)類(lèi)是否實(shí)現(xiàn)了某接口,例: myControl is IValidate //MyControl類(lèi)的實(shí)例myControl是否實(shí)現(xiàn)了IValidate接口

      當(dāng)然,也可用as來(lái)作轉(zhuǎn)換,根據(jù)轉(zhuǎn)換結(jié)果是否為null來(lái)判斷某個(gè)類(lèi)是否實(shí)現(xiàn)了某接口,例: IValidate val = myControl as IValidate;if(null == val){...//沒(méi)有實(shí)現(xiàn)IValidate接口 } else {...//實(shí)現(xiàn)了IValidate接口

      }

      如果一個(gè)類(lèi)從多個(gè)接口繼承,而這些接口中如果定義的同名的方法,則實(shí)現(xiàn)接口的方法時(shí),必須加接口名來(lái)區(qū)別,寫(xiě)成 接口名.方法名。假設(shè)Test類(lèi)從IDataStore和ISerializable二個(gè)接口繼承,而這二個(gè)接口都有SaveData()方法,實(shí)現(xiàn)SaveData()方法時(shí)必須寫(xiě)成: class Test: ISerializable, IDataStore {

      void ISerializable.SaveData()

      {

      ...}

      void IDataStore.SaveData()

      {

      ...} } 如果一個(gè)類(lèi)從多個(gè)接口繼承,為了方便可以定義一個(gè)新的接口,這個(gè)接口繼續(xù)多個(gè)接口,然后類(lèi)直接從這個(gè)接口繼承就可以了,這個(gè)叫合并接口。例: interface ISaveData: ISerializable, IDataStore { //不需要定義任何方法或成員,只是用作合并 } class Test: ISaveData //只要繼承ISaveData就可以了 {...} C# 操作符優(yōu)先級(jí)(從高到低)

      初級(jí)操作符()x.y f(x)a[x] x++ x--new typeof sizeof checked unchecked 一元操作符 +位移操作符 << >> 關(guān)系操作符 < > <= >= is 等于操作符 == 邏輯與

      & 邏輯異或 ^ 邏輯或

      | 條件與

      && 條件或

      || 條件操作符 ?: 賦值操作符 = *= /= %= +=-= <<= >>= &= ^= |= 所有的二元操作符除賦值符外都是左聯(lián)合的,即從左到右計(jì)算。

      typeof()運(yùn)算符可以從一個(gè)類(lèi)名得到一個(gè)System.Type對(duì)象,而從System.Object對(duì)象繼承來(lái)的GetType()方法則可從一個(gè)類(lèi)實(shí)例來(lái)得到一個(gè)System.Type對(duì)象。例: Type t1 = typeof(Apple);//Apple是一個(gè)類(lèi)名

      Apple apple = new Apple();//apple是Apple類(lèi)的一個(gè)實(shí)例 Type t2 = apple.GetType();//t1與t2是相同的 通過(guò)反射得到一個(gè)類(lèi)的所有成員和方法: Type t = typeof(Apple);string className = t.ToString();//得到類(lèi)名

      MethodInfo[] methods = t.GetMethods();//得到所有方法 foreach(MethodInfo method in methods){ //用method.ToString()得到方法名 } MemberInfo[] members = t.GetMembers();//得到所有成員 foreach(MemberInfo member in members){ //用member.ToString()得到成員名 } sizeof()操作符用來(lái)計(jì)算值類(lèi)型變量在內(nèi)存中占用的字節(jié)數(shù)(Bytes),并且它只能在unsafe(非安全)

      代碼中使用。例:

      static unsafe public void ShowSizes(){

      int i, j;

      j = sizeof(short);

      j = sizeof(i);} 盡可能使用復(fù)合賦值操作符,它比不用復(fù)合賦值操作符的效率高。for語(yǔ)句的語(yǔ)法為:

      for(initialization;Boolean-expression;step)

      embedded-statement 在initialization和step部份還可以使用逗號(hào)操作符,例: for(int i = '0', j = 1;i <= 'xFF';i++, j++)for(int i = 1, j = 1;i < 1000;i += j, j = i!~ ++--true false 二元:+32)/ 9)* 5;

      } } 代表的(delegate)目的與C++中的函數(shù)指針相同,代表不是在編譯時(shí)被定義的,而是在運(yùn)行時(shí)被定義的。

      代表主要有二個(gè)用途:回調(diào)(Callback)和事件處理(event)回調(diào)通常用于異步處理和自定義處理。例: class DBManager {

      static DBConnection[] activeConnections;

      //聲明回調(diào)函數(shù)

      public void delegate EnumConnectionCallback(DBConnection connection);

      public static void EnumConnections(EnumConnectionCallback callback)

      {

      foreach(DBConnection connection in activeConnections)

      {

      callback(connection);//執(zhí)行回調(diào)函數(shù)

      }

      } } //調(diào)用

      class DelegateApp {

      public static void ActiveConncetionCallback(DBConnection connection)//處理函數(shù)

      {

      ...}

      public void main()

      {

      //創(chuàng)建指向具體處理函數(shù)的代表實(shí)例(新建一個(gè)代表,讓它指向具體的處理函數(shù))

      DBManager.EmnuConnectionCallback myCallback = new DBManager.EmnuConnectionCallback(ActiveConncetionCallback);

      DBManager.EnumConnections(myCallback);

      } } //使用靜態(tài)代表,上面的調(diào)用改為 class DelegateApp {

      //創(chuàng)建一個(gè)指向處理函數(shù)的靜態(tài)代表

      public static DBManager.EmnuConnectionCallback myCallback

      = new DBManager.EmnuConnectionCallback(ActiveConncetionCallback);

      public static void ActiveConncetionCallback(DBConnection connection)

      {...} public void main()

      {

      DBManager.EnumConnections(myCallback);

      } } //在需要時(shí)才創(chuàng)建代表,上面的調(diào)用改為

      class DelegateApp {

      //將創(chuàng)建代表放在屬性的getter方法中

      public static DBManager.EmnuConnectionCallback myCallback

      {

      get

      {

      retun new DBManager.EmnuConnectionCallback(ActiveConncetionCallback);

      }

      }

      public static void ActiveConncetionCallback(DBConnection connection)

      {...} public void main()

      {

      DelegateApp app = new DelegateApp();//創(chuàng)建應(yīng)用程序

      DBManager.EnumConnections(myCallback);

      } } 可以將多個(gè)代表整合成單個(gè)代表,例: class CompositeDelegateApp {

      public static void LogEvent(Part part)

      {

      ...}

      public static void EmailPurchasingMgr(Part part)

      {

      ...}

      public static void Main()

      {

      //定義二個(gè)代表

      InventoryManager.OutOfStockExceptionMethod LogEventCallback

      = new InventoryManager.OutOfStockExceptionMethod(LogEvent);

      InventoryManager.OutOfStockExceptionMethod EmailPurchasingMgrCallback

      = new InventoryManager.OutOfStockExceptionMethod(EmailPurchasingMgr);

      //整合為一個(gè)代表,注意后加的代表先執(zhí)行(這里是先執(zhí)行LogEventCallback)

      InventoryManager.OutOfStockExceptionMethod onHandExceptionEventsCallback

      = EmailPurchasingMgrCallback + LogEventCallback;

      //調(diào)用代表

      InventoryManager mgr = new InventoryManager();

      mgr.ProcessInventory(onHandExceptionEventsCallback);

      //InventoryManager類(lèi)的ProcessInventory方法的原型為:

      //public void ProcessInventory(OutOfStockExceptionMethod exception);

      } } 可以根據(jù)需要將多個(gè)代表自由地組合成單個(gè)代表,例: class CompositeDelegateApp {

      //代表指向的處理函數(shù)(三個(gè)代表三個(gè)函數(shù))

      public static void LogEvent(Part part)

      {

      ...} public static void EmailPurchasingMgr(Part part){...}

      public static void EmailStoreMgr(Part part)

      {

      ...}

      public static void Main()

      {

      //通過(guò)數(shù)組定義三個(gè)代表

      InventoryManager.OutOfStockExceptionMethod[] exceptionMethods

      = new InventoryManager.OutOfStockExceptionMethod[3];

      exceptionMethods[0] = new InventoryManager.OutOfStockExceptionMethod(LogEvent);

      exceptionMethods[1] = new InventoryManager.OutOfStockExceptionMethod(EmailPurchasingMgr);

      exceptionMethods[2] = new InventoryManager.OutOfStockExceptionMethod(EmailStoreMgr);

      int location = 1;

      //再定義一個(gè)代表(用于組合成單代表)

      InventoryManager.OutOfStockExceptionMethod compositeDelegate;

      //根據(jù)需要組合

      if(location = 2)

      {

      compositeDelegate = exceptionMethods[0] + exceptionMethods[1];

      }

      else

      {

      compositeDelegate = exceptionMethods[0] + exceptionMethods[2];

      }

      //調(diào)用代表

      InventoryManager mgr = new InventoryManager();

      mgr.ProcessInventory(compositeDelegate);

      } } C#的事件遵循“發(fā)布——預(yù)訂”的設(shè)計(jì)模式。在這種模式中,一個(gè)類(lèi)公布能夠出現(xiàn)的所有事件,然后任何的類(lèi)都可以預(yù)訂這些事件。一旦事件產(chǎn)生,運(yùn)行環(huán)境就負(fù)責(zé)通知每個(gè)訂戶事件已經(jīng)發(fā)生了。

      當(dāng)代表作為事件的處理結(jié)果時(shí)(或者說(shuō)定義具有代表的事件),定義的代表必須指向二個(gè)參數(shù)的方法:一個(gè)參數(shù)是引發(fā)事件的對(duì)象(發(fā)布者),另一個(gè)是事件信息對(duì)象(這個(gè)對(duì)象必須從EventArgs類(lèi)中派生)。例: using System;

      class InventoryChangeEventArgs: EventArgs //事件信息對(duì)象,從EventArgs類(lèi)派生 {...//假設(shè)定義二個(gè)public屬性string Sku和int Change } class InventoryManager

      //事件的發(fā)布者 {

      //聲明代表

      public delegate void InventoryChangeEventHander(object source, InventoryChangeEventArgs e);

      //發(fā)布事件,event關(guān)鍵字可將一個(gè)代表指向多個(gè)處理函數(shù)

      public event InventoryChangeEventHandler onInventoryChangeHander;

      public void UpdateInventory(string sku, int change)

      {

      if(change == 0)

      return;

      InventoryChangeEventArgs e = new InventoryChangeEventArgs(sku, change);

      //觸發(fā)事件

      if(onInventoryChangeHandler!= null)//如果有預(yù)訂者就觸發(fā)

      onInventoryChangeHandler(this, e);//執(zhí)行代表指向的處理函數(shù)

      } } class InventoryWatcher

      //事件的預(yù)訂者 {

      public InventoryWatcher(InventoryManager mgr)//mgr參數(shù)用于聯(lián)結(jié)發(fā)布者

      {

      this.inventoryManager = mgr;

      //預(yù)訂事件,用 += 調(diào)用多個(gè)處理函數(shù)

      mgr.onInventroyChangeHandler += new InventoryManager.InventoryChangeEventHandler(onInventoryChange);

      //事件處理函數(shù)

      void onInventroyChange(object source, InventroyChangeEventArgs e)

      {

      ...}

      InventoryManager inventoryManager;

      } } class EventsApp

      //主程序 {

      public static void Main()

      {

      InventoryManager inventoryManager = new InventoryManager();

      InventoryWatcher inventoryWatcher = new InventoryWatcher(inventoryManager);

      inventoryManager.UpdateInventory(“111 006 116”,-2);

      inventoryManager.UpdateInventory(“111 006 116”, 5);

      } } Microsoft Windows NT和IBM OS/2等操作系統(tǒng)都支持占先型多任務(wù)。在占先型多任務(wù)執(zhí)行中,處理器負(fù)責(zé)

      給每個(gè)線程分配一定量的運(yùn)行時(shí)間——一個(gè)時(shí)間片(timeslice)。處理器接著在不同的線程之間進(jìn)行切換,執(zhí)行相應(yīng)的處理。在單處理器的計(jì)算機(jī)上,并不能真正實(shí)現(xiàn)多個(gè)線程的同時(shí)運(yùn)行,除非運(yùn)行在多個(gè)處理器 的計(jì)算機(jī)上。操作系統(tǒng)調(diào)度的多線程只是根據(jù)分配給每個(gè)線程時(shí)間片進(jìn)行切換執(zhí)行,感覺(jué)上就像同時(shí)執(zhí)行。

      上下文切換(context switching)是線程運(yùn)行的一部分,處理器使用一個(gè)硬件時(shí)間來(lái)判斷一個(gè)指定線程的時(shí)間片何時(shí)結(jié)束。當(dāng)這個(gè)硬件計(jì)時(shí)器給出中斷信號(hào)時(shí),處理器把當(dāng)前運(yùn)行的線程所用的所有寄存器(registers)數(shù)據(jù)存儲(chǔ)到堆棧中。然后,處理器把堆棧里那些相同的寄存器信息存放到一種被稱(chēng)為“上下文結(jié)構(gòu)”的數(shù)據(jù)結(jié)構(gòu)中。當(dāng)處理器要切換回原來(lái)執(zhí)行的線程時(shí),它反向執(zhí)行這個(gè)過(guò)程,利用與該線程相關(guān)的上下文結(jié)構(gòu),在寄存器里重新恢復(fù)與這一線程相關(guān)的信息。這樣的一個(gè)完整過(guò)程稱(chēng)為“上下文切換”。多線程允許應(yīng)用程序把任務(wù)分割為多個(gè)線程,它們彼此之間可以獨(dú)立地工作,最大限度地利用了處理器時(shí)間。using System;using System.Threading;class SimpleThreadApp {

      public static void WorkerThreadMethod()//線程的執(zhí)行體

      {

      ...//執(zhí)行一些操作

      }

      public static void Main()

      {

      //創(chuàng)建一個(gè)線程代表指向線程的執(zhí)行體,ThreadStart是創(chuàng)建新線程必須用到的代表

      ThreadStart worker = new ThreadStart(WorkerThreadMethod);

      Thread t = new Thread(worker);//用線程代表創(chuàng)建線程

      t.Start();

      //執(zhí)行線程

      } } 可以通過(guò)兩種方式來(lái)得到一個(gè)Thread對(duì)象:一種是通過(guò)創(chuàng)建一個(gè)新線程來(lái)得到,如上例;另一種在正在執(zhí)行的線程調(diào)用靜態(tài)的Thread.CurrentThread方法。

      靜態(tài)方法Thread.Sleep(int ms)可以讓當(dāng)前線程(它自動(dòng)調(diào)用Thread.CurrentThread)暫停指定毫秒的時(shí)間。

      如果使用Thread.Sleep(0)那么當(dāng)前線程將一直處于等待中,直到另一個(gè)線程調(diào)用這個(gè)線程的實(shí)例方法Thread.Interrupt方法,等待才會(huì)結(jié)束。使用Thread.Suspend方法也能掛起線程,Thread.Suspend方法可以被當(dāng)前線程或其他線程調(diào)用,而Thread.Sleep(0)只能由當(dāng)前線程在執(zhí)行體中調(diào)用。當(dāng)線程用Thread.Suspend掛起時(shí),必須用Thread.Resume方法恢復(fù)。不論Thread.Suspend方法調(diào)用了多少次,只要調(diào)用Thread.Resume方法一次就可以線程恢復(fù)執(zhí)行。用Thread.Suspend方法并不會(huì)阻塞線程,調(diào)用立即返回。而Thread.Sleep(0)則會(huì)阻塞線程。所以確切地說(shuō)Thread.Sleep(0)暫停線程,而不是掛起線程。

      使用Thread.Abort方法可以終止正在執(zhí)行的線程。當(dāng)Thread.Abort方法被調(diào)用時(shí),線程不會(huì)立即終止執(zhí)行。運(yùn)行環(huán)境將會(huì)等待,直到線程到達(dá)文檔中所描述的“安全點(diǎn)”。如果要確保線程已經(jīng)完全停止,可以使用Thread.Join方法。這是一個(gè)同步調(diào)用,同步調(diào)用意味著直到線程完全停止,調(diào)用才會(huì)返回。

      Thread.Priority屬性用于設(shè)置的線程的優(yōu)先級(jí)。其值是Thread.ThreadPriority枚舉值,可以設(shè)為Highest, AboveNormal,Normal, BelowNormal, Lowest。缺省值是Thread.ThreadPriority.Normal。

      線程的同步是為了解決多個(gè)線程同時(shí)使用同一對(duì)象產(chǎn)生的一些問(wèn)題。通過(guò)同步,可以指定代碼的臨界區(qū)(critical section),一次只有一個(gè)線程可以進(jìn)入臨界區(qū)。使用System.Monitor類(lèi)(鎖定與信號(hào)量)進(jìn)行線程同步: using System;using System.Threading;public void SaveData(string text)//線程執(zhí)行函數(shù)或線程執(zhí)行函數(shù)調(diào)用的對(duì)象的方法 {

      ...//執(zhí)行其他一些不需要同步的處理

      Monitor.Enter(this);//獲取對(duì)象的Monitor鎖

      ...//執(zhí)行需要同步的處理

      Monitor.Exit(this);//釋放對(duì)象的Monitor鎖

      ...//執(zhí)行其他一些不需要同步的處理

      } 說(shuō)明:當(dāng)執(zhí)行Monitor.Enter方法時(shí)。這個(gè)方法會(huì)試圖獲取對(duì)象上的Monitor鎖,如果另一個(gè)線程已經(jīng)擁有了這個(gè)鎖,這個(gè)方法將會(huì)阻塞(block),直到這個(gè)鎖被釋放。

      也可用C#的lock語(yǔ)句來(lái)獲得和釋放一個(gè)Monitor鎖。上面同步寫(xiě)成:public void SaveData(string text)//線程執(zhí)行函數(shù)或線程執(zhí)行函數(shù)調(diào)用的對(duì)象的方法 {

      ...//執(zhí)行其他一些不需要同步的處理

      lock(this)//獲取對(duì)象的Monitor鎖,代碼塊執(zhí)行完成后釋放Monitor鎖

      {

      ...//執(zhí)行需要同步的處理

      }

      ...//執(zhí)行其他一些不需要同步的處理 } 也可以使用System.Threading名稱(chēng)空間的Mutex類(lèi)(互斥類(lèi))進(jìn)行線程同步。與Monitor鎖一樣,一次只有一個(gè)線程能獲得一個(gè)給定的互斥。但Mutex要慢得多,但它增加了靈活性。例:

      using System;using System.Threading;class Database {

      Mutex mutex = new Mutex(false);//創(chuàng)建一個(gè)互斥,但不立即獲得它

      //注意:創(chuàng)建互斥在需要同步的方法之外,實(shí)際上它只要?jiǎng)?chuàng)建一個(gè)實(shí)例

      public void SaveData(string text)//需要同步的方法

      {

      mutex.WaitOne();//等待獲得互斥

      ...//需要同步的處理

      mntex.Close();//釋放互斥

      } } Mutex類(lèi)重載了三個(gè)構(gòu)造函數(shù):

      Mutex()

      //創(chuàng)建并使創(chuàng)建類(lèi)立即獲得互斥

      Mutex(bool initiallyOwned)

      //創(chuàng)建時(shí)可指定是否要立即獲得互斥 Mutex(bool initiallyOwned, string muterName)//還可以指定互斥的名稱(chēng) Mutex.WaitOne方法也重載了三次: Mutex.WaitOne()

      //一直等待

      Mutex.WaitOne(TimeSpan time, bool exitContext)//等待TimeSpan指定的時(shí)間 Mutex.WaitOne(int milliseconds, bool exitContext)//等待指定的毫秒 線程的用法:

      1)并發(fā)操作:比如一個(gè)程序監(jiān)視多個(gè)COM口,當(dāng)每個(gè)COM接到信息時(shí)執(zhí)行一段處理時(shí)。2)復(fù)雜長(zhǎng)時(shí)間操作:一個(gè)長(zhǎng)時(shí)間的復(fù)雜操作可能會(huì)使界面停滯,停止用戶響應(yīng),如果還允許用戶停止它,或者顯示進(jìn)度條、顯示操作執(zhí)行進(jìn)程信息時(shí)。

      反射(Reflection)就是能夠在運(yùn)行時(shí)查找類(lèi)型信息,這是因?yàn)?NET編譯的可執(zhí)行(PE)文件中包括MSIL和元數(shù)據(jù)(metadata)。

      反射的中心是類(lèi)System.Type。System.Type是一個(gè)抽象類(lèi),代表公用類(lèi)型系統(tǒng)(Common Type System, CTS)中的一種類(lèi)型。

      using System;using System.Reflection;//反射命名空間,必須引用 public static void Main(string[] args){

      int i = 6;

      Type t = i.GetType();

      //根據(jù)實(shí)例得到類(lèi)型

      t = Type.GetType(“System.Int32”);//根據(jù)類(lèi)型的字符名稱(chēng)得到類(lèi)型

      } 通過(guò)Assembly類(lèi)可以得到已經(jīng)編譯.NET Framework程序的中所有類(lèi)型,例: using System;using System.Diagnostics;//為了使用Process類(lèi) using System.Reflection;//為了使用Assembly類(lèi) class GetTypesApp {

      protected static string GetAssemblyName(string[] args)

      {

      string assemblyName;

      if(0 == args.Length)//如果參數(shù)為空,取當(dāng)前進(jìn)程的名稱(chēng)

      {

      Process p = Process.GetCurrentProcess();

      assemblyName = p.ProcessName + “.exe”;

      }

      else

      assemblyName = args[0];//取第一個(gè)參數(shù),即當(dāng)前運(yùn)行程序名

      return assemblyName;

      }

      public static void Main(string[] args)

      {

      string assemblyName = GetAssemblyName(args);

      Assembly a = Assembly.LoadFrom(assemblyName);//調(diào)用編譯程序集

      Type[] types = a.GetTypes();

      //得到多個(gè)類(lèi)型

      foreach(Type t in types)

      //遍歷類(lèi)型數(shù)組

      {

      ...//取得t.FullName,t.BaseType.FullName等類(lèi)型信息

      }

      } } 一個(gè)應(yīng)用程序可以包括多個(gè)代碼模塊。若要將一個(gè)cs文件編譯一個(gè)模塊,只要執(zhí)行下面的命令:

      csc /target:module 要編譯的模塊.cs //csc是C Sharp Compiler(C#編譯器)然后在應(yīng)用程序中using編譯的模塊.cs中的NameSpace即可應(yīng)用了。要反射應(yīng)用程序中所有代碼模塊(Module),只要:

      Assembly a = Assembly.LoadFrom(assemblyName);//應(yīng)用程序的物理文件名 Module[] modules = a.GetModules();foreach(Module m in modules){...//顯示m.Name等

      } 后期綁定(latebinding),例:

      string[] fileNames = Directory.GetFiles(Environment.CurrentDirectory, “*.dll”);foreach(string fileName in fileNames){

      Assembly a = Assembly.LoadFrom(fileName);

      Type[] types = a.GetTypes();

      foreach(Type t in types)

      {

      if(t.IsSubclassOf(typeof(CommProtocol)))//判斷是否有CommProtocol的派生類(lèi)

      {

      object o = Activator.CreateInstance(t);//生成實(shí)例

      MethodInfo mi = t.GetMethod(“DisplayName”);

      mi.Invoke(o, null);

      //調(diào)用方法

      }

      } } //帶參數(shù)的例子

      namespace Programming_CSharp {

      using System;

      using System.Reflection;

      public class Tester

      {

      public static void Main()

      {

      Type t = Type.GetType(“System.Math”);

      Object o = Activator.CreateInstance(t);

      // 定義參數(shù)類(lèi)型

      Type[] paramTypes = new Type[1];

      paramTypes[0]= Type.GetType(“System.Double”);

      MethodInfo CosineInfo = t.GetMethod(“Cos”, paramTypes);

      //設(shè)置參數(shù)數(shù)據(jù)

      Object[] parameters = new Object[1];

      parameters[0] = 45;

      //執(zhí)行方法

      Object returnVal = CosineInfo.Invoke(o, parameters);

      Console.WriteLine(“The cosine of a 45 degree angle {0}”, returnVal);

      }

      } } 動(dòng)態(tài)生成代碼和動(dòng)態(tài)調(diào)用的完整例子: //動(dòng)態(tài)生成代碼的部分 using System;using System.Reflection;using System.Reflection.Emit;//動(dòng)態(tài)生成代碼必須引用 namespace ILGenServer {

      public class CodeGenerator

      {

      public CodeGenerator()

      {

      currentDomain = AppDomain.CurrentDomain;//得到當(dāng)前域

      assemblyName = new AssemblyName();//從域創(chuàng)建一個(gè)程序集

      assemblyName.Name = “TempAssembly”;

      //得到一個(gè)動(dòng)態(tài)編譯生成器,AssemblyBuilerAccess.Run表示只在內(nèi)存中運(yùn)行,不能保存

      assemblyBuilder = currentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilerAccess.Run);

      //從編譯生成器得到一個(gè)模塊生成器

      moduleBuilder = assemblyBuilder.DefineDynamicModule(“TempModule”);

      //模塊生成器得到類(lèi)生成器

      typeBuilder = moduleBuilder.DefineType(“TempClass”, TypeAttributes.Public);

      //為類(lèi)添加一個(gè)方法

      methodBuilder = typeBuilder.DefineMethod(“HelloWord”, MethodAttributes.Public, null, null);

      //為方法寫(xiě)入代碼,生成代碼必須使用到IL生成器

      msil = methodBuilder.GetILGenerator();

      msil.EmitWriteLine(“Hello World”);msil.Emit(OpCodes.Ret);//最后還需要編譯(build)一下類(lèi) t = typeBuilder.CreateType();

      }

      AppDomain currentDomain;

      AssemblyName assemblyName;

      AssemblyBuilder assemblyBuilder;

      ModuleBuilder moduleBuilder;

      TypeBuilder typeBuilder;

      MethodBuilder methodBuilder;

      ILGenerator msil;

      object o;

      Type t;

      public Type T

      {

      get

      {

      return this.t;

      }

      }

      } } //動(dòng)態(tài)調(diào)用的部分

      using System;using System.Reflection;using ILGenServer;//引用動(dòng)態(tài)生成代碼的類(lèi) public class ILGenClientApp {

      public static void Main({

      CodeGenerator gen = new CodeGenerator();//創(chuàng)建動(dòng)態(tài)生成類(lèi)

      Type t = gen.T;

      if(null!= t)

      {

      object o = Activator.CreateInstance(t);

      MethodInfo helloWorld = t.GetMethod(“HelloWorld”);//為調(diào)用方法創(chuàng)建一個(gè)MethodInfo

      if(null!= helloWorld)

      {

      helloWorld.Invoke(o, null);//調(diào)用方法

      }

      }

      } } 調(diào)用DLL using System;using System.Runtime.InteropServices;//為了使用DLLImport特性

      class PInvokeApp {

      [DllImport(“user32.dll”, CharSet=CharSet.Ansi)] //CharSet.Ansi指定Ansi版本的函數(shù)(MessageBoxA),CharSet.Unicode指定Unicode版本的函數(shù)(MessageBoxW)

      static extern int MessageBox(int hWnd, string msg, string caption, int type);//聲明DLL中的函數(shù)

      //[DllImport(“user32.dll”, EntryPoint=“MessageBoxA”)] //用這種方法使用不同的函數(shù)名

      //static extern int MsgBox(int hWnd, string msg, string caption, int type);

      //[DllImport(“user32.dll”, CharSet=CharSet.Unicode)] //調(diào)用Unicode版的DLL函數(shù)

      //static extern int MessageBox(int hWnd, [MarshalAs(UnmanagedType.LPWStr)]string msg,// [MarshalAs(UnmanagedType.LPWStr)]string caption, int type);//將LPWStr翻譯為string型,缺省情況系統(tǒng)只將LPStr翻譯成string

      public static void Main()

      {

      MessageBox(0, “Hello, World!”, “CaptionString”, 0);//調(diào)用DLL中的函數(shù)

      } } 例2,使用回調(diào): class CallbackApp {

      [DllImport(“user32.dll”)]

      static extern int GetWindowText(int hWnd, StringBuilder text, int count);

      delegate bool CallbackDef(int hWnd, int lParam);

      [DllImport(“user32.dll”)]

      static extern int EnumWindows(CallbackDef callback, int lParam);

      static bool PrintWindow(int hWnd, int lParam)

      {

      StringBuilder text = new StringBuilder(255);

      GetWindowText(hWnd, text, 255);

      Console.WriteLine(“Window Caption: {0}”, text);

      return true;

      }

      static void Main()

      {

      CallbackDef callback = new CallbackDef(PrintWindow);

      EnumWindows(callback, 0);

      } } 關(guān)鍵字unsafe指定標(biāo)記塊在非控環(huán)境中運(yùn)行。該關(guān)鍵字可以用于所有的方法,包括構(gòu)造函數(shù)和屬性,甚至還有方法中的代碼塊。關(guān)鍵字fixed負(fù)責(zé)受控對(duì)象的固定(pinning)。Pinning是一種動(dòng)作,向垃圾收集(Garbage Collector, GC)指定一些不能被移動(dòng)的對(duì)象。為了不在內(nèi)存中產(chǎn)生碎片,.NET運(yùn)行環(huán)境把對(duì)象四處移動(dòng),以便于最有效地利用內(nèi)存。使用fixed后指定對(duì)象將不會(huì)被移動(dòng),所以就可以用指針來(lái)訪問(wèn)它。

      C#中只能得到值類(lèi)型、數(shù)組和字符串的指針。在數(shù)組的情況下,第一個(gè)元素必須是值類(lèi)型,因?yàn)镃#實(shí)際上是返回一個(gè)指向數(shù)組第一個(gè)元素的指針,而不是返回?cái)?shù)組自身。& 取一個(gè)變量的內(nèi)存地址(即指向該變量的指針)* 取指針?biāo)缸兞康闹?> 取成員

      例:using System;class UnsafeApp {

      public static unsafe void GetValues(int* x, int* y)

      {

      *x = 6;

      *y = 42;

      }

      public static unsafe void Main()

      {

      int a = 1;

      int b = 2;

      GetValues(&a, &b);

      } } fixed語(yǔ)法為:fixed(type* ptr = expression)statements其中type也可以為非控類(lèi)型,也可是void;expression是任何產(chǎn)生一個(gè)type指針的表達(dá)式;statements是應(yīng)用的代碼塊。例: fixed(int* f = &foo.x)//foo是Foo類(lèi)的一個(gè)實(shí)例,x是Foo類(lèi)的一個(gè)int屬性 {

      SetFooValue(f);//SetFooValue方法的定義為unsafe static void SetFooValue(int* x)} 傳統(tǒng)的COM組件可以通過(guò)互操作層(COM Interop)與.NET運(yùn)行環(huán)境交互?;ゲ僮鲗犹幚碓谕泄苓\(yùn)行環(huán)境和非托管區(qū)域中的COM組件操作之間傳遞所有的消息。

      要使COM組件能在.NET環(huán)境中使用,必須為COM組件生成元數(shù)據(jù)。.NET運(yùn)行環(huán)境用元數(shù)據(jù)層業(yè)判斷類(lèi)型信息。在運(yùn)行時(shí)刻使用類(lèi)型信息,以便生成RCW(Runtime Callable Wrapper,運(yùn)行時(shí)可調(diào)用包裝)。當(dāng).NET應(yīng)用程序與COM對(duì)象交互時(shí),RCW處理對(duì)COM對(duì)象的裝載和調(diào)用。RCW還完成許多其他的工作,如管理對(duì)象標(biāo)識(shí)、對(duì)象生存周期以及接口緩沖區(qū)。對(duì)象生存周期管理十分關(guān)鍵,因?yàn)?NET GC把對(duì)象到處移動(dòng),并且當(dāng)對(duì)象不再使用時(shí),自動(dòng)處理這些對(duì)象。RCW服務(wù)告訴.NET,應(yīng)用程序正與托管.NET組件交互,同時(shí)又使非托管COM組件“覺(jué)得”COM對(duì)象是被傳統(tǒng)的COM客戶端調(diào)用的。

      為了為COM組件生成元數(shù)據(jù)包裝,必須使用tlbimp.exe(TypeLib Importer)工具: tlbimp some_COM.tlb /out:som_COM.dll

      第三篇:繪圖總結(jié)

      繪圖總結(jié)

      一、總結(jié)

      (1)圖形的對(duì)稱(chēng)行,繪畫(huà)中心線,節(jié)省大量的時(shí)間和圖紙干凈整潔。(2)圖層的線粗分明,查看圖紙的時(shí)候,比較清晰,尤其對(duì)折彎線的辨別。(3)繪畫(huà)三視圖,體現(xiàn)高平齊寬相等。

      (4)標(biāo)注的時(shí)候,孔的定位、折彎的定位標(biāo)注線,分開(kāi)來(lái)標(biāo)注??偝叽鐔为?dú)拉開(kāi),便于下料查看尺寸。

      (5)繪圖比例,必須明確規(guī)定。

      二、看圖的順序

      (1)查看圖號(hào)、名稱(chēng)、材料和厚度。(2)查看展開(kāi)圖的總體尺寸,長(zhǎng)和寬。

      (3)查看定位孔的尺寸,定位基準(zhǔn)長(zhǎng)和寬,孔的標(biāo)注。(4)折彎尺寸。(5)線性角度的標(biāo)注。(6)折彎圖尺寸查看。(7)折彎角度的查看。

      三、制圖技術(shù)要求

      (1)制圖表面平整、無(wú)毛刺、無(wú)凹坑。

      (2)制件應(yīng)符合Q/LS-2008-29《鈑金件檢驗(yàn)規(guī)范》

      (3)未注公差符合Q/LS027-028

      四、圖幅規(guī)范

      A0(841×1189)A1(594×841)A2(420×594)A3(297×420)A4(210×297)

      五、線性的分類(lèi)和規(guī)則

      細(xì)實(shí)線 .應(yīng)用過(guò)渡線、標(biāo)注線、指引線、剖面線、折彎線。

      波浪線 .?dāng)嗔烟幍倪吔缇€,視圖與剖視圖的分界線。雙折線 .?dāng)嗔烟幍倪吔缇€,視圖與剖視圖的分界線。粗實(shí)線 .可見(jiàn)輪廓線

      粗實(shí)現(xiàn) . 表格圖、流程圖中的主要表示線

      細(xì)虛線 .不可見(jiàn)輪廓線

      細(xì)點(diǎn)畫(huà)線.對(duì)稱(chēng)中心線、分度圓、孔系分布的中心線、剖切線

      細(xì)雙點(diǎn)畫(huà)線.成形前的輪廓線、線、軌跡線、制成品的輪廓線、特定區(qū)域線、工藝結(jié)構(gòu)的輪廓線、中斷線

      六GB/T 4457.4-2002規(guī)定

      粗細(xì)線寬度比率2 :1 0.13mm、0.18mm、0.25mm、0.35mm、0.5mm、0.7mm、1mm、1.4mm、2mm

      第四篇:C#實(shí)習(xí)總結(jié)

      現(xiàn)在的社會(huì)日新月異,科技飛速發(fā)展,但是隨之而來(lái)的環(huán)境問(wèn)題也日益嚴(yán)重,當(dāng)然這也有很多其他諸如人口、能源等因素,不過(guò)這些讓人們?cè)絹?lái)越重視綠色產(chǎn)業(yè),而軟件就是首當(dāng)其沖的一個(gè)。我積極參加了學(xué)校組織的軟件實(shí)習(xí),主要是對(duì).Net方面的實(shí)訓(xùn)和實(shí)戰(zhàn),一方面想要繼續(xù)深造之前在大學(xué)里面學(xué)習(xí)的軟件方面的知識(shí),另一方面,也是為了自己的職業(yè)規(guī)劃,說(shuō)直接點(diǎn),就是以后找份好工作。雖然實(shí)訓(xùn)中時(shí)間安排有點(diǎn)緊,但很充實(shí),學(xué)到了很多之前在大學(xué)課堂上沒(méi)有學(xué)到的知識(shí),可以說(shuō)我從這次實(shí)訓(xùn)中的收獲很大。

      對(duì)于計(jì)算機(jī)編程,我可以說(shuō)從高中就開(kāi)始接觸,大學(xué)從專(zhuān)科開(kāi)始一直學(xué)習(xí)的都是軟件開(kāi)發(fā)的專(zhuān)業(yè),學(xué)過(guò)C#、Java,學(xué)過(guò)開(kāi)發(fā),也學(xué)過(guò)測(cè)試。但是這次實(shí)訓(xùn)讓我體會(huì)了和之前完全不同的學(xué)習(xí)感受,不僅是時(shí)間安排、或者說(shuō)效率還是教學(xué)授課的方式上,都是和大學(xué)課堂完全不同的,不是一節(jié)課講一點(diǎn),也不是一點(diǎn)一點(diǎn)教給你,這個(gè)實(shí)訓(xùn)中更多的是培養(yǎng)我們獨(dú)立動(dòng)手解決實(shí)際問(wèn)題的能力,分析考慮問(wèn)題的方法思路,讓我們真正成長(zhǎng)起來(lái)。

      學(xué)校為我們提供了良好的學(xué)習(xí)的平臺(tái),提供了好工作的面試機(jī)會(huì)。我們覺(jué)得我們更應(yīng)該充分利用資源,珍惜機(jī)會(huì),努力學(xué)習(xí),不斷地給自己“充電”,這樣才能不斷的開(kāi)拓進(jìn)取,勇于創(chuàng)新,才不至于被社會(huì)淘汰。

      這次實(shí)習(xí)中,我們主要有S0、S1、S2三個(gè)階段,S0階段主要是自學(xué)C#基礎(chǔ)知識(shí),S1階段是在老師的指導(dǎo)下學(xué)習(xí)C#基礎(chǔ)編程、C#桌面應(yīng)用開(kāi)發(fā)、C#數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)、C#網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)、軟件測(cè)試和軟件工程幾個(gè)方面的技術(shù)方面的課程,S2階段則是進(jìn)入項(xiàng)目實(shí)戰(zhàn),做實(shí)際項(xiàng)目來(lái)進(jìn)行鞏固和總結(jié)。整個(gè)過(guò)程中,還有穿插了職業(yè)素養(yǎng)課和英語(yǔ)口語(yǔ)課,學(xué)技術(shù)的同時(shí),我們也注重職業(yè)素養(yǎng)的培養(yǎng)和英語(yǔ)口語(yǔ)的鍛煉。

      到目前為止,我們實(shí)習(xí)的主要成果有(按時(shí)間順序):Point24(24點(diǎn)游戲求解小程序)、HandsUp(舉手游戲模擬小程序)、SimpleCalculator(簡(jiǎn)單計(jì)算器)、GottaU(捕捉鼠標(biāo)小游戲)、TypeGame(打字小游戲)、WebBrowser(簡(jiǎn)易網(wǎng)絡(luò)瀏覽器)、Checker(單機(jī)對(duì)戰(zhàn)跳棋小游戲)、MDITextEditor(多文檔界面文本編輯器)、FileManager(文件管理器)、SimpleMediaPlayer(簡(jiǎn)單媒體播放器)等,這些小程序或是項(xiàng)目,雖然和市面的那些軟件比起來(lái),在功能強(qiáng)大、界面美觀、Bug稀少等方面都有欠缺,但是都是實(shí)打?qū)嵉?,我們自己?dòng)腦、動(dòng)手做出來(lái)的,當(dāng)然在做的過(guò)程中遇到了不少困難、挫折,但是正因?yàn)檫@些困難和挫折,我們才真正學(xué)到了知識(shí)和技術(shù)。更值得注意的則是,在老師帶領(lǐng)我們做項(xiàng)目的過(guò)程中,我們從老師的言傳身教中學(xué)到了很多很多編程思想、解決問(wèn)題的方法思路等各種“無(wú)形”的知識(shí)。

      眾多收獲之中,讓我感觸頗深的,則是老師給我們介紹的“10-90”原則和“Quality-Client-Cost”原則?!?0-90”原則的意思是,我們通常都是花10%的代價(jià)就可以完成一件事或者一個(gè)項(xiàng)目的90%,而剩下的10%,卻需要我們花費(fèi)90%的金錢(qián)、精力等各種代價(jià),能不能做到這最后的10%,往往是衡量一個(gè)人或者一家公司很重要的一個(gè)原則。而且這個(gè)原則還是可以嵌套的,最后10%的部分中,也可以再分成90%和10%,同樣是開(kāi)始的90%需要10%的代價(jià),最后的10%需要90%的代價(jià)。這個(gè)原則不僅適用于做軟件、做項(xiàng)目、做公司,其實(shí)人生中做人也是如此,很多時(shí)候最后的10%是很重要的一把標(biāo)尺。雖然不能說(shuō)這個(gè)原則放之四海而皆準(zhǔn),但是確實(shí)是適用于很多地方、很多方面,讓我獲益良多?!癚uality-Client-Cost”原則講的則是做軟件或是做軟件公司的一個(gè)原則,就是質(zhì)量一定要放在第一位,客戶在第二位。我自己原本心目中對(duì)這三項(xiàng)的排序是Client-Quality-Cost”,但是老師的講解點(diǎn)醒了我,最具有說(shuō)服力的例子,就是像微軟這樣的大公司,都是Quality第一的,他們寧可花費(fèi)多一些,價(jià)格貴一些,但是一定把產(chǎn)品盡善盡美。這個(gè)原則同樣可以用在人生中,Quality就是人品、品德、素質(zhì),Client是朋友、客戶、親人,我們當(dāng)然應(yīng)該把個(gè)人的品格放在第一位。這些都屬于這次實(shí)習(xí)中,我在技術(shù)以外的收獲。

      另外在實(shí)習(xí)還有職業(yè)素養(yǎng)課中,也學(xué)到了很多其他在今后的工作中,要注意的東西,首先要有團(tuán)隊(duì)合作精神,現(xiàn)金的大中型軟件的編寫(xiě),分工越來(lái)越細(xì),這樣在開(kāi)發(fā)、測(cè)試的過(guò)程中,團(tuán)隊(duì)的合作、成員間的交流就變得尤為重要,是決定效率的重要因素;要學(xué)會(huì)獨(dú)立解決問(wèn)題,工作不比在學(xué)校學(xué)習(xí),遇到的各種實(shí)際問(wèn)題不會(huì)有老師專(zhuān)門(mén)幫助解決,自己獨(dú)立分析、解決問(wèn)題的能力就變得極其重要;要有創(chuàng)新精神,在工作和學(xué)習(xí)中,如果只是一味的模仿、學(xué)習(xí),那就永遠(yuǎn)不會(huì)真正得學(xué)得得心應(yīng)手、融會(huì)貫通,必須自己去實(shí)踐,在實(shí)踐中創(chuàng)新,這樣才能把學(xué)來(lái)的,變成自己的;要有耐心,學(xué)會(huì)自我規(guī)劃和管控,耐心自是不必多說(shuō),有耐心才能把事情仔細(xì)做好,而公司的管理制度和學(xué)校根本上的不同,使得自我規(guī)劃和管控就成了能否按時(shí)圓滿完成任務(wù)的很重要的條件。

      通過(guò)這次實(shí)習(xí),我在個(gè)人素質(zhì)方面有較大的提高,不僅是在C#的技術(shù)方面,還包括面對(duì)、分析和處理問(wèn)題的思路、能力,思維的創(chuàng)造性和全面性,交流和溝通能力,英語(yǔ)口語(yǔ)水平,同時(shí)也克服了一些自己的缺點(diǎn),獲得很大進(jìn)步。

      總的來(lái)說(shuō),這次實(shí)習(xí)對(duì)我有很大意義,不僅鞏固和實(shí)踐了之前在大學(xué)課堂上學(xué)到的各種知識(shí),擴(kuò)充了自己對(duì)軟件技術(shù)方面的知識(shí)儲(chǔ)備,同時(shí)也給了我很大的成就感,增強(qiáng)了我的自信。并不是說(shuō)因?yàn)槲易龀傻暮茈y的程序,或者做出來(lái)的軟件很強(qiáng)很完善,但都是自己認(rèn)真完成的,過(guò)程中有遇到各種困難和挫折,但是經(jīng)

      過(guò)網(wǎng)上查資料、小組討論、向老師請(qǐng)教等幾種途徑,最終都克服了,當(dāng)最終自己完成時(shí),總會(huì)有一些成就感。

      此外,我還人知到在以后的工作和學(xué)習(xí)中,不僅要努力學(xué)習(xí)和鍛煉專(zhuān)業(yè)技能知識(shí),包括C#技術(shù)、算法技巧、MVC模式框架的開(kāi)發(fā)、中間技術(shù)等等,而且也要注意讓自己興趣廣泛起來(lái),拓寬自己的知識(shí)面,多積累各種知識(shí),這不僅對(duì)以后的軟件開(kāi)發(fā)工作有一定好處,對(duì)自身的個(gè)人修養(yǎng)的提升也是大有裨益。

      社會(huì)的競(jìng)爭(zhēng)是激烈的,我想我們應(yīng)該好好把握住大學(xué)學(xué)習(xí)的時(shí)間,充實(shí)、完善自我,掌握更多的專(zhuān)業(yè)知識(shí),加強(qiáng)實(shí)踐和設(shè)計(jì)能力,同時(shí)也注意全面發(fā)展,這樣更有利于將來(lái)的發(fā)展,在自己的專(zhuān)業(yè)領(lǐng)域有所作為。

      第五篇:c#基礎(chǔ)總結(jié)

      【1】面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的三大特點(diǎn)是什么?答:【23】Main函數(shù)特點(diǎn)?答:1)Main方法是C#程序的限定,默認(rèn)的為private【2】三種命名法則的特點(diǎn)?答:匈牙利命名法:在變限定符,返回類(lèi)型為void或int類(lèi)型,Main方法必須是靜態(tài)方法;3)一個(gè)類(lèi)或結(jié)構(gòu)只能有一個(gè)有效的入駝表示法:一個(gè)標(biāo)示符用若干個(gè)有意義的英語(yǔ)單詞或口點(diǎn)函數(shù);4)main方法必須定義在某一個(gè)類(lèi)中。縮寫(xiě)組成,第一個(gè)單詞首字母小寫(xiě),后邊的首字母大【24】多態(tài)(重寫(xiě)、隱藏)

      寫(xiě);Pascal表示法:與駱駝表示法類(lèi)似,但是第一個(gè) 單詞的首字母也需要大寫(xiě)?!?】C#注釋的三種形式特點(diǎn)?答1)單行注釋?zhuān)?/ 2)class A /// {public virtual void F()【4】引用類(lèi)型和值類(lèi)型的數(shù)據(jù)類(lèi)型? {Console.WriteLine(“A.F”);}} abstract class B:A(1)int valOne = 0;{public abstract override void F();}int valTwo = valOne;答:abstract override 是不可以一起修飾 int valThree = 333;例:在下面的例子里 valTwo = 333;TestValueRefRef1 = new TestValueRef();class A TestValueRefRef2 = Ref1;{public A(){PrintFields();} Ref2.value = 444;public virtual void PrintFields(){} } Console.WriteLine(“values:{0},{1}”, Ref1.value, class B:A Ref2.value);{int x=1;int y;public B(){y=-1;} Console.WriteLine(“values:{0}, {1},{2}”,valOne, public override void valTwo,valThree);PrintFields(){Console.WriteLine(“x={0},y={1}”,答:輸出結(jié)果:values:444,444 x,y);} 當(dāng)使用new B()創(chuàng)建B的實(shí)例時(shí),產(chǎn)生什么輸出?(2)public class EnumTest答:x=1,y=0 { enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};分析:執(zhí)行new B()時(shí),由于B繼承自A,所以會(huì)調(diào)用static void Main()A的構(gòu)造函數(shù),并執(zhí)行其中的PrintFields()方法,由{int x=(int)Days.Sun;inty=(int)Days.Fri;于該方法為虛方法,在繼承類(lèi)中被重寫(xiě),所以,將執(zhí)Console.WriteLine(“Sun = {0}”, x);行B中的PrintFields()方法。此時(shí),將在DOS界面Console.WriteLine(“Fri = {0}”, y);}} 上輸出“x=1,y=0”,然后,在運(yùn)行B的構(gòu)造函數(shù)中的答:輸出結(jié)果:Sun = 2Fri = 7 y=-1。(建議同學(xué)們將此程序放入到代碼中,設(shè)置斷點(diǎn)【5】枚舉類(lèi)型的字段和關(guān)聯(lián)值?枚舉類(lèi)型有三個(gè)要看執(zhí)行過(guò)程。)

      【25】什么是多態(tài)對(duì)象?答:用基類(lèi)類(lèi)名聲明,但是特性 修飾符 enum 枚舉名 : 基礎(chǔ)類(lèi)型 {枚舉成員聲明,枚舉成員聲明,??,枚舉成員聲明}默認(rèn)的基礎(chǔ)函數(shù)來(lái)實(shí)例化的對(duì)象。這類(lèi)對(duì)象的主要用途是引發(fā)多類(lèi)型為int;關(guān)聯(lián)值:如果沒(méi)有被聲明,默認(rèn)為0。態(tài),為了將它們和一般的對(duì)象(聲明和創(chuàng)建都使用同【6】強(qiáng)制類(lèi)型轉(zhuǎn)換(例:若有double f=2.7;int 一個(gè)類(lèi)型名的對(duì)象)加以區(qū)別、揭示它們的特點(diǎn)和用2)將源類(lèi)型的對(duì)象途,這種形態(tài)的對(duì)象稱(chēng)為多態(tài)對(duì)象。轉(zhuǎn)換成為目的類(lèi)型的對(duì)象 【26】接口的特點(diǎn)。答:接口只能包含抽象方法,不【7】運(yùn)算符&和&&的區(qū)別?答:條件“與”運(yùn)算符(&&)沒(méi)有訪問(wèn)修飾符,接口成員必須是方法屬性事件或者時(shí)才計(jì)算第二個(gè)操作數(shù)。而&需要計(jì)算所有操作數(shù),索引器不能包含常數(shù)字段運(yùn)算符也不能有靜態(tài)成員。并且優(yōu)先級(jí)高于&& 【27】委托和事件,【8】裝箱和拆箱的概念?答:裝箱就是把一個(gè)值類(lèi)型委托的定義修飾符 delegate 返回類(lèi)型 委托類(lèi)型名(參數(shù)列表); 【9】for循環(huán)和if語(yǔ)句聯(lián)合使用的程序分析,for(;;)eg: public delegate int DelegateClass(stringinfo);

      和continue的區(qū)別?答:break跳出循委托的創(chuàng)建(實(shí)例化)委托對(duì)象 = new 委托名(關(guān)聯(lián)方法); 【11】命名空間的特點(diǎn)答:它提供一種命名機(jī)制,是eg: DelegateClass obj=new DelegateClass(MethodA);

      合方式無(wú)關(guān),不能表明源文件的存取方式,命名空間DelegateClass obj=MethodA;//隱式創(chuàng)建和初是按層次組織的。始化(不用new)【12】數(shù)組元素的的復(fù)制和讀值 例:分析下列語(yǔ)句: int[3]{5,6,2},new int[5]{6,9,7,8,3},new Hello(string target);} int[2]{3,2}};myArray3[2][2]的值是(D)A)9;B)2;該語(yǔ)句的作用是:在TestCS 命名空間中定義了了一C)6;D)越界 個(gè)名為Hello 的委托類(lèi)型;

      【13】類(lèi)和對(duì)象的關(guān)系?答:類(lèi)是對(duì)象的抽象,對(duì)象【28】Windows窗體中Button按鈕觸發(fā)的事件是什【14】關(guān)鍵字this和base的區(qū)別?答:base指代基【29】Windows窗體中控件的標(biāo)識(shí)符如何修改?答:【15】關(guān)鍵字new、using的多種用法?答:new修飾【30】如何修改Windows窗體的啟動(dòng)窗體?答:修改被重寫(xiě),但new修飾符可終止這一特性;向下傳播; 實(shí)例化一個(gè)對(duì)象。Using:導(dǎo)入命名空間;自動(dòng)釋放【31】要使用SQL Server需要使用哪兩個(gè)命名空間? Using代碼框里的資源。【16】索引器的特點(diǎn)?答:索引器允許重載;字符串Using System.Date.SqlClient: 【32】什么是DataSet、DataAdapter??jī)烧呗?lián)系?答:過(guò)簽名標(biāo)識(shí);通過(guò)元素訪問(wèn)來(lái)訪問(wèn);必須為實(shí)例成員;索引器的get訪問(wèn)器具有與索引器相同的形參表;除DataAdapter:數(shù)據(jù)適配器,數(shù)據(jù)庫(kù)與DataSet間的橋value參數(shù)外,索引器的set訪問(wèn)器還具有與索引器梁,把數(shù)據(jù)庫(kù)中數(shù)據(jù)下載到DataSet或回傳回去。相同的形參表。【33】用戶登錄和密碼修改(帶數(shù)據(jù)庫(kù))【17】靜態(tài)數(shù)據(jù)成員特點(diǎn)?答:為所有類(lèi)所共享,區(qū)用戶登錄 【18】構(gòu)造函數(shù)的特點(diǎn)?答:(1)構(gòu)造函數(shù)名與類(lèi)名UserName='“ + txtUsername.Text.Trim().ToLower()+ ”' and UserPwd='“ + txtPassword.Text.Trim()+ 【19】析構(gòu)函數(shù)的特點(diǎn)?答:(1)析構(gòu)函數(shù)名是在類(lèi)”'“;if(OperateDB.ExecuteReader(sql))型(默認(rèn)為空)和修飾符;(3)析構(gòu)函數(shù)不能被重載。{username = txtUsername.Text.Trim().ToLower();【20】什么是方法的重載?重載的特點(diǎn)是什么?答: frmMain frm = new frmMain();frm.Show();this.Hide();} 定義一組方法。重載的特點(diǎn):1)位于同一類(lèi)中;2)else

      方法名相同;3)方法參考列表不同,包括參數(shù)個(gè)數(shù)不{MessageBox.Show(”用戶名或密碼錯(cuò)誤“, ”出錯(cuò)了“, 同和參數(shù)類(lèi)型不同;4)與方法返回值和修飾符沒(méi)關(guān)系。MessageBoxButtons.OK, MessageBoxIcon.Error);} 【21】虛函數(shù)的特點(diǎn)?答:1)虛方法前不允許有修改密碼: 修飾符;2)虛方法不能是私有的,因此不能使用private修飾符; where UserName='” + frmLogin.username + “' and 【22】抽象類(lèi)和抽象方法的主要特點(diǎn)?答:抽象類(lèi):UserPwd='” + txtOldPwd.Text.Trim()+ “'”;(或者if(OperateDB.ExecuteReader(sqlCheckPwd))說(shuō),不能產(chǎn)生對(duì)象。但是,它可以有構(gòu)造函數(shù)。(2){string sql = “update UserInfo set UserPwd='” 設(shè)計(jì)abstract類(lèi)的目的是為了被繼承。抽象方法:是+ txtNewPwd.Text.Trim()+ “' where UserName='” + 不完整的,不能執(zhí)行的。frmLogin.username + “'”;

      if(OperateDB.ExecuteNonQuery(sql)== 1)

      {MessageBox.Show(“密碼修改成功!”);}else

      { MessageBox.Show(“密碼修改失?。 ?;}}

      else{MessageBox.Show(“舊密碼不正確!”);}

      【34】抽象類(lèi)定義和繼承使用

      特點(diǎn):1.沒(méi)有被完整定義,因而它不能用來(lái)實(shí)例化,或者說(shuō),不能產(chǎn)生對(duì)象。(但是,它可以有構(gòu)造函數(shù)。)2.設(shè)計(jì)abstract類(lèi)的目的是為了被繼承。public abstract class Employee{public virtual void Pay(){ }

      public abstract void CalculatePay();} public class HourlyEmployee: Employee

      {public override void Pay(){CalculatePay();}public override void CalculatePay(){ }} 【35】接口及繼承類(lèi)的使用

      特定功能的抽象成員的集合。一個(gè)類(lèi)可以繼承多個(gè)接口,從而獲得多個(gè)行為的描述,將它們組合成新的功能并在類(lèi)中實(shí)現(xiàn)。繼承類(lèi)中必須實(shí)現(xiàn)接口中的所有抽象成員。

      定義接口的格式:修飾符 interface 接口名:基接口列表 {接口體} 其中,接口體的聲明可以包括:接口方法聲明;接口屬性聲明;接口事件聲明;接口索引器聲明

      public delegate void

      StringListEvent(IStringList sender);public interface IStringList{ void Add(string s);//方法int Count{get;}//屬性event StringListEvent Changed;//事件string this[int index]{get;set;}//索引器} 【編程題例題】

      定義一MobilePhone類(lèi),包括屬性成員——網(wǎng)絡(luò)類(lèi)型(NetworkType),字段成員——屏幕尺寸(screenSize)、手機(jī)品牌(brand),手機(jī)型號(hào)

      (brandModel),公共方法成員——Open、Close。其中screenSize為單位是英寸的雙精度數(shù),brand為字符串,NetworkType只能是“GSM”或“CDMA”字符串。要求:(1)在此類(lèi)中包含構(gòu)造函數(shù),構(gòu)造函數(shù)用于對(duì)數(shù)據(jù)(屏幕尺寸、手機(jī)品牌和手機(jī)型號(hào))進(jìn)行初始化。(2)公共成員方法中輸出相應(yīng)提示信息(參見(jiàn)(3)中的輸出結(jié)果格式)。(3)寫(xiě)一測(cè)試類(lèi),在類(lèi)中實(shí)例化一MobilePhone對(duì)象,最后能在DOS界面下顯示如下結(jié)果:諾基亞N81(屏幕尺寸2.0英寸),是一款GSM手機(jī)。手機(jī)關(guān)機(jī)了。using System;

      public enum NetworkType {GSM,CDMA,}

      public class MobilePhone {public double screenSize;public string brand;

      public string brandModel;

      public NetworkType networkType;public NetworkType NetworkType{get { return networkType;}}

      public MobilePhone(double ss, string bra, string bm, NetworkType nt){screenSize = ss;brand = bra;brandModel = bm;networkType = nt;}public void Open()

      {Console.WriteLine(“{0}{1}(屏幕尺寸{2}英寸),是一款{3}手機(jī).”,brand,brandModel,screenSize.ToString(“.0”), networkType);}

      public void Close()

      {Console.WriteLine(“手機(jī)關(guān)機(jī)了。”);} }

      public class Test

      {public static void Main()

      {MobilePhone mp = new MobilePhone(2.0, “諾基亞”, “N81”, NetworkType.GSM);mp.Open();mp.Close();

      System.Console.ReadLine();} }

      【例】寫(xiě)一名為Desk的類(lèi),包含兩個(gè)字段Length(雙精度類(lèi)型)、Height(雙精度類(lèi)型)。再寫(xiě)一繼承類(lèi)ComputerDesk類(lèi)。ComputerDesk類(lèi)除了有Length和Height外,還有KeyboardTray(字符串類(lèi)型)。Public class desk {double length;double height;}

      Public class computerdesk:desk {string keyboardtray}

      下載C#繪圖雙緩沖技術(shù)總結(jié)word格式文檔
      下載C#繪圖雙緩沖技術(shù)總結(jié).doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        C#期末總結(jié)

        C#期末總結(jié) 接觸C#已經(jīng)有半學(xué)期時(shí)間,對(duì)C#感觸頗多。C#作為邏輯性極強(qiáng),功能強(qiáng)大的程序編程語(yǔ)言,僅僅學(xué)習(xí)半學(xué)期是遠(yuǎn)遠(yuǎn)不夠的,希望自己能在這條路上不斷前行,能夠活到老學(xué)到老。跟......

        Mathematica繪圖總結(jié)

        Mathematica繪圖總結(jié) Mathematica是一個(gè)強(qiáng)大的數(shù)學(xué)工具,它可以廣泛應(yīng)用到數(shù)學(xué)的各個(gè)領(lǐng)域中。而Mathematica的繪圖以其豐富的形式,多樣的變化,鮮明的色彩給人以直觀的視覺(jué)感受,并......

        仿真繪圖總結(jié)(大全)

        Simulink仿真繪圖總結(jié):建議使用方法4,方法1,2不宜使用。 1. 運(yùn)行仿真模型,用Scope觀察結(jié)果,用ALT+PrintScreen抓取圖形,Ctrl+V粘貼到Word。2. 使用Scope打印功能,在Word中插入圖形......

        AUTO CAD繪圖技術(shù)及技巧

        AUTO CAD繪圖技術(shù)及技巧 基本技術(shù) 主要包括交互技術(shù)、圖形變換技術(shù)、曲面造型和實(shí)體造型技術(shù)等。在計(jì)算機(jī)輔助設(shè)計(jì)中,交互技術(shù)是必不可少的。交互式cad系統(tǒng), 指用戶在使用計(jì)ca......

        C#個(gè)人總結(jié)5則范文

        C#調(diào)用瀏覽器的功能實(shí)現(xiàn)淺析 2009-11-13 來(lái)自:網(wǎng)上整理字體大?。骸敬笾行 ? 摘要:C#調(diào)用瀏覽器的功能實(shí)現(xiàn)使用了什么方法?C#調(diào)用瀏覽器的功能實(shí)現(xiàn)的步驟是什么呢?那么本文就向......

        C#實(shí)訓(xùn)總結(jié)

        C#實(shí)訓(xùn)總結(jié) 經(jīng)過(guò)兩周的課程實(shí)訓(xùn),讓我感觸很深。雖然C#已經(jīng)學(xué)了一個(gè)學(xué)期,但是到真正寫(xiě)代碼的時(shí)候?qū)σ郧八鶎W(xué)的知識(shí)還是有點(diǎn)陌生,不知道該從哪里著手。還有以前總是以為寫(xiě)需求分......

        C#實(shí)訓(xùn)總結(jié)

        C#實(shí)訓(xùn)總結(jié) 實(shí)訓(xùn)期間讓我學(xué)到很多東西,不僅在理論上讓我對(duì)it領(lǐng)域有了全新的認(rèn)識(shí),在實(shí)踐能力上也得到了很大的提高,真正的學(xué)到了學(xué)以致用,更學(xué)到很多做人的道理,對(duì)我來(lái)說(shuō)受益匪淺......

        c#進(jìn)銷(xiāo)存實(shí)習(xí)總結(jié)

        實(shí)習(xí)總結(jié) 一、實(shí)習(xí)目的: 掌握進(jìn)銷(xiāo)存的基本業(yè)務(wù)軟件流程及C/S結(jié)構(gòu)應(yīng)用開(kāi)發(fā)技術(shù)。通過(guò)本次學(xué)習(xí),加深對(duì)軟件行業(yè)的了解。掌握軟件開(kāi)發(fā)的流程,體系。把所學(xué)習(xí)的理論知識(shí)和實(shí)踐項(xiàng)目......