C#重點知識詳解(一)作者:未知 來源:CSDN 發佈時間:2006-5-22 3:43:53 發佈人:admin在微軟的.NET推出後,關於C#的有關文章也相繼出現,作爲微軟的重要的與JAVA抗衡的語言,C#具有很多優點。本文將選一些C#語言中的重要知識詳細介紹, C#重點知識詳解(二)作者:未知 來源:CSDN 發佈時間:2006-5-22 3:43:56 發佈人:admin第二章 內存管理
c#內存管理提供了與java一樣的自動內存管理功能,讓程序員從繁重的內存管理中擺脫出來,內存管理提高了代碼的質量和提高了開發效率。 c#限制了着指針的使用,免除了程序員對內存泄漏的煩惱,但是不是意味着向java程序員一樣c#程序員在也不能使用指針代來的好處。微軟在設計C#語言時考慮到這個問題,在一方面拋棄指針的同時,另一方面採用折衷的辦法,通過一個標誌來時程序引入指針。 首先我們來了解自動內存管理 public class Stack { private Node first = null; public bool Empty { get { return (first == null); } } public object Pop() { if (first == null) throw new Exception("Can't Pop from an empty Stack."); else { object temp = first.Value; first = first.Next; return temp; } } public void Push(object o) { first = new Node(o, first); } class Node { public Node Next; public object Value; public Node(object value): this(value, null) {} public Node(object value, Node next) { Next = next; Value = value; } } } 程序創建了一個stack類來實現一個鏈,使用一個push方法創建Node節點實例和一個當不再需要Node節點時的收集器。一個節點實例不能被任何代碼訪問時,就被收集。例如當一個點元素被移出棧,相關的Node就被收集。 The example class Test { static void Main() { Stack s = new Stack(); for (int i = 0; i < 10; i++) s.Push(i); s = null; } } 關於指針的引用,c#中使用unsafe標誌來代表隊指針的引用。以下程序演示了指針的用法,不過由於使用指針,內存管理就不得不手工完成。 using System; class Test { unsafe static void Locations(byte[] ar) { fixed (byte *p = ar) { byte *p_elem = p; for (int i = 0; i < ar.Length; i++) { byte value = *p_elem; string addr = int.Format((int) p_elem, "X"); Console.WriteLine("arr[{0}] at 0x{1} is {2}", i, addr, value); p_elem++; } } } static void Main() { byte[] arr = new byte[] {1, 2, 3, 4, 5}; WriteLocations(ar); } } c#重點知識詳解(三)作者:未知 來源:eNet硅谷動力,CSDN 發佈時間:2006-5-22 3:43:57 發佈人:admin第三章: 類屬性
使用過RAD開發工具的一定inspector很熟悉,程序員通過它可以操作對象的屬性,DELPHI中引入了PUBLISH關鍵字來公佈對象屬性受到程序員的普遍歡迎.通過存取標誌來訪問private成員,在c#中有兩種途徑揭示類的命名屬性——通過域成員或者通過屬性。前者是作爲具有公共訪問性的成員變量而被實現的;後者並不直接回應存儲位置,只是通過存取標誌(accessors)被訪問。當你想讀出或寫入屬性的值時,存取標誌限定了被實現的語句。用於讀出屬性的值的存取標誌記爲關鍵字get,而要修改屬性的值的讀寫符標誌記爲set。 類屬性 只能讀 get 只能寫 set 可讀可寫 set/get 請看例子: using System; public class Test { private int m_nWrite; private int readonly m_nRead=100; private int m_nWriteRead; public int WRITEREAD { get {return m_nWriteRead;} set {m_nWriteRead=value;} } public int WRITE { set { m_nWrite = value; } } public int READ { get {return m_nRead;} } } class TestApp { public static void Main() { Test MyTest = new Test(); int i=MyTest.READ; //get MyTest.WRITE=250; //set MyTest.WRITEREAD+=10000000 ; //set and get Console.WriteLine("get:{0} set:{1} set/get:{2} ",i,MyTest.WRITE,MyTest.WRITEREAD); } } 如果你想要隱藏類內部存儲結構的細節時,就應該採用存取標誌。存取標誌給值參數中的屬性傳遞新值。同時你可以獲得實現在set標誌中增加有效代碼的機會。 c#重點知識詳解(四)作者:未知 來源:CSDN 發佈時間:2006-5-22 3:43:58 發佈人:admin第四章:C# 中的加框與去框
C# 運行時中有兩種類型:引用類型(reference)(在 C# 中用類聲明)和值類型(value)(在 C# 中用結構聲明)。引用和值類型在幾個重要方面有所不同。值類型“感覺上”象一個數據。它包括預定義數值類型(如int、bool)以及用戶定義的類型(circle、Point等)。如上文所述,值類型的變量是實際的值,所以在您使用變量時,通常處理的是實際的值。 1>:首先,讓我們來看一看值類型(value)(在 C# 中用結構聲明)。 對於任何類型的非框機構都又如下的形。 //------------------------------------- struct T_Point { T x,y; T_Point(T x,y) { this.x=x; this.y=y } } //------------------------------------- sample: class test{ struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } public static void Main() { Point p = new Point(10, 10); object f = p; p.x = 20; Console.Write(((Point)f).x); Console.Write(p.x); } } 讓我麼來看一看最後的結果是什麼?結果是10,20.在第二次指定變量後,兩個獨立的變量包含相同的值。 修改 p 的值不會改變 f 的值. 2>:引用類型用於所有不能用作值類型的對象。引用類型的變量指向堆中對象的實例。這意味着在將一個變量指定 給另一個變量時,只是指定了引用,而不是值。 對於任何類型的框類都又如下的形。 //------------------------------------------------------ class T_Point { T x,y; T_Point(T x,y) { this.x=x; this.y=y } } //-------------------------------------------------------- class test{ class Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } public static void Main() { Point p = new Point(10, 10); object f = p; p.x = 20; Console.Write(((Point)f).x); Console.Write(p.x); } } 讓我麼來看一看最後的結果是什麼?很奇怪嗎,結果是20,20.在第二次指定變量後,p 和 f 指向同一對象。這意味着修改 p 的名稱也將改變 f 的名稱,因爲它們引用同一實例。修改類值的成員稱爲“變更者”,而不具有任何變更者的類稱爲不可變類。不可變類的存在可以使類的行爲類似於值類,但不能寫入爲值類。 在c#語言中同時使用引用和值兩種類型是很重要的。值類型輕便高效,而引用類型適用於面向對象的開發。但是,儘管我們有兩了種類型,但有時我們需要的是更爲簡單的模型,使用單一的、能夠囊括所有可能值的類型。這樣一個通用基類能夠調用任何值的虛函數。寫入能夠存儲任何值的集合類。爲實現這一目的,c#語言運行時採用一種方法讓值類型在需要時轉化爲引用類型,即通過稱爲加框的進程。被加框的類型是通用基類,可以被各種類型的對象引用。 解框 int i = 123; object k = i;// 將 int i 加框到對象 k 中 int j=(int)k; // 解框 k 到 value2 當賦值給 k 時,作爲賦值的一部分,C# 編譯器將創建足夠容納堆中 int 的引用類型包裝,將值複製到該加框,然後將加框標記爲實際類型,以便運行時瞭解加框的類型。要從加框中取值,必須使用強制類型裝換來指定加框的類型(對象能夠保留任何類型)。在執行過程中,運行時將檢查對象變量引用的類型是否爲強制類型轉換 中指定的類型。如果類型正確,值將從加框中複製回值類型變量。如果類型不正確,將導致異常。請注意解除加框過程中不會進行其他轉換;類型必須完全匹配。 請注意以下代碼: long i = 123; object k = i;// 將 long i 加框到對象 k 中 ulong j=(ulong)k; #error 由於加框類型於解框類型的不同將出錯。如果認爲像c++語言一樣下面的操作將正確那也是不對的。 long i = 123; object k = i; int j=(int)k; #error 最後總結一下加框和解框。加框和解框使編寫和使用具有通用對象參數的函數變得簡單而直接。 c#重點知識解答(五)作者:未知 來源:CSDN 發佈時間:2006-5-22 3:43:59 發佈人:admin第五章:代理 代理 二 c#重點知識詳解(六)作者:未知 來源:CSDN 發佈時間:2006-5-22 3:44:00 發佈人:admin如同java一樣,在c#中寫一個多線程應用是非常簡單的,本章將介紹如何在c#種開發多線程程序。在.net中線程是由System.Threading 名字空間所定義的。所以你必須包含這個名字空間。
using System.Threading; 開始一個線程 System.Threading 名字空間的線程類描述了一個線程對象,通過使用類對象,你可以創建、刪除、停止及恢復一個線程。創建一個新線程通過new 操作,並可以通過start()方法啓動線程 thread = new Thread(new ThreadStart(HelloWorld)); thread.Start(); 注意:和java程序不同,創建新線程並調用start()方法後並不去調用run()方法,而是傳遞線程調用程序 下面是啓動線程執行的函數 protected void HelloWorld() { string str ; Console.write("helloworld"); } } 殺死一個線程 線程類的 Abort()方法可以永久的殺死一個線程。在殺死一個線程起前應該判斷線程是否在生存期間。 if ( thread.IsAlive ) { thread.Abort(); } 停止一個線程 Thread.Sleep 方法能夠在一個固定週期類停止一個線程 thread.Sleep(); 設定線程優先級 線程類中的ThreadPriority 屬性是用來設定一個ThreadPriority的優先級別。線程優先級別包括Normal, AboveNormal, BelowNormal, Highest, and Lowest幾種。 thread.Priority = ThreadPriority.Highest; 掛起一個線程 調用線程類的Suspend()方法將掛起一個線程直到使用Resume()方法喚起她。在掛起一個線程起前應該判斷線程是否在活動期間。 if (thread.ThreadState = ThreadState.Running ) { thread.Suspend(); } 喚起一個線程 通過使用Resume()方法可以喚起一個被掛起線程。在掛起一個線程起前應該判斷線程是否在掛起期間,如果 線程未被掛起則方法不起作用。 if (thread.ThreadState = ThreadState.Suspended ) { thread.Resume(); } |
C#重點知識詳解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.