標籤:java 使用 io strong 資料 for ar 問題
C#是面向組件的語言 程式設計語言趨勢:自包含 自描述
記憶體回收 異常處理 型別安全
C#繼承與c++與Java的糅合
版本控制 virtual override
.cs作為副檔名
命名空間 程式 類型 成員 程式集
程式集的副檔名一般為 .dll(library)或者 .exe(application)。主要看其中是否包含main入口函數。
C#本身沒有類庫
X()方法和委託調用
X is T
X as T
int [] 一維數組 int[][] 一維數組的一維數組 int[ , ]二維數組
C#的類型系統是統一的,任何類型的值都可以被處理成對象。
值的類型可以通過過boxing與unboxing操作處理成對象。
如: int i=0; object xx=I; int j=(int)xx;
重載 operator
語句:塊(允許在只能使用單個語句的上下文中編寫多個語句)、聲明語句、運算式語句、選擇語句(if、switch)、迭代語句(while、do、for、foreach)、跳躍陳述式(break、continue、goto、throw、return)
try-catch:捕捉塊語句執行過程中的異常
try-finally 指定一個終止代碼塊。無論異常與否,必被執行
checked與unchecked用於控制整形算術元素按與轉換的溢出
lock用於獲得給定對象的互斥鎖,執行語句,然後釋放該鎖。
//using 用於擷取一個資源,相當於#include或者import
//namespace相當於 package
foreach與freemarker中的語言相似 foreach( int x in nums){……}
注意foreach只是引用集合中元素的值,並不能改集合中元素的值。
try throw catch 一般條件判斷,決定throw的內容,此處與java稍有不同
using擷取一個資源,執行一個語句,然後處理該資源。
如:using(TextWriter w=File.CreateText("test.txt")){
w.WriteLine("Line One");
}
類的聲明:
指定類的特性與修飾符 類名 基類 被該類實現的介面名 類體
使用new運算子建立執行個體(對象)
類的成員: 靜態成員(類) 執行個體成員(對象)
類的訪問性許可權:public、protected、internal(僅限於當前程式集)、protected internal、private
類的聲明,可在類名後面加上":"後面寫上基類名字。省略基類名字的直接預設從object基類派生。
靜態欄位:static修飾的。他只表示一個儲存位置。無論建立多少個執行個體,靜態欄位只有一個副本。(此特徵可用作訊息介面)
執行個體欄位:每個對象都有自己獨立的副本
方法:
靜態方法:只能通過類來訪問
執行個體方法:通過對象來訪問
方法的簽名:方法名、參數的數目、每個參數的修飾符與類型
參數:
值參數:相當於一個自變數。初始值是從該參數所傳遞的自變數獲得的,對值參數的修改不會影響傳遞的自變數
引用參數:用雅虎輸入和輸出參數的傳遞。對飲用參數的修改影響傳遞的自變數。(ref)
輸出參數:用於輸出參數的傳遞,與引用參數類似。不同之處在於調用方提供的自變數的初始值始終無關緊要。(out)
參數數組:允許將可變長度的自變數列表傳遞給方法。只有方法的最後一個參數能夠被聲明為數組參數,而且數組參數必須是一維的。(params)帶數組參數的
傳遞參考型別參數
參考型別的變數不直接包含其資料;它包含的是對其資料的引用。當通過值傳遞參考型別的參數時,有可能更改引用所指向的資料,如某類成員的值。但是無法更改引用本身的值(指標值);也就是說,不能使用相同的引用為新類分配記憶體並使之在塊外保持。若要這樣做,請使用 ref(或 out)關鍵字傳遞參數。為了簡單起見,以下樣本使用 ref。
方法調用中,既可以傳遞參數數群組類型的單個變數,也可以傳遞參數數組的元素類型的若干個變數。對於後者情形,數組將被自動建立,並且通過給定的自變數初始化。
方法體與局部變數:與java一樣,在獲得局部變數值之前,必須對其明確賦值。
靜態方法與執行個體方法:靜態方法不對具體的執行個體進行操作,只能訪問靜態成員。執行個體方法技能訪問靜態成員也可以訪問執行個體成員。在調用執行個體方法的執行個體上可以通過this來訪問該執行個體本身。靜態方法中使用this是錯誤的。
虛擬方法、重寫方法、抽象方法:在一個虛擬方法的調用中,調用所涉及的執行個體的運行時類型確定了調用的應該是該方法的哪一個實現,非虛擬方法主要靠編譯時間類型確定方法的選取。虛擬方法用於引入新方法,而重寫虛擬方法聲明則用於使現有上網繼承方法專用化,virtual
抽象方法:沒有實現的虛擬方法。Abstract 只允許在抽象類別中使用抽象方法
委託:函數指標的類似作用,用於調用一些方法體。這樣可以避免相同方法體的重複編寫,而可以再不同的類中直接使用。
介面是一種不包含操作實現部分的實作類別
抽象類別
訊息:
類的修飾符:
Abstract:抽象類別。不可用來建立執行個體,盡可用於產生繼承類。
Internal: 該類盡可見於同一個程式集中。
New: 只用於嵌套類,指明類隱藏一個同名的被繼承成員。
Private: 嵌套類。僅可被定義類本身訪問。
Protected:嵌套類。只能從定義類的衍生類別中訪問。
Public: 任何人都可以聲明該類對象的額引用,或者訪問它的公用成員。
Sealed: 不能作為其他類的基類、(有點類似Java中的final修飾符)
類的成員:
域:成員變數。修飾符:public,private,internal,protected。靜態域、執行個體域
屬性:一個提供對一個對象或類的特性進行訪問的類成員。 屬性的聲明包括特定的集合:1個new修飾符與4個存取修飾詞(static、virtual、override、abstract)
方法:1個new修飾符與4個存取修飾詞(static、virtual、override、abstract)注意:在一個方法中定義另一個方法是語法錯誤的。但可以在一個方法體內調用另一個方法
嵌套類與嵌套介面:
建構函式:建構函式被public、internal、以外的修飾符(protected、protected internal與private)修飾,則必須顯示的寫出解構函式。
System.String是不可變的字串。System.StringBuilder存放了一個可變的字串,並提供一些對這個字串修改的方法。
const關鍵字用來聲明編譯時間常量,readonly用來聲明運行時常量。
不可以將非靜態方法寫成靜態,也不可以將非virtual的方法寫成virtual。因為覆寫方法的時候,兩個方法的簽名必須一致。唯一的例外是將virtual換成override。
索引器:允許按照數組的額方式索引對象的數組元素。帶參數的屬性
屬性:對對象或者類的特性進行訪問的類成員。Get訪問器不需要參數,但傳回值的類型必須與指定的一致。Set也不需要參數,編譯器假定他帶一個參數,其類型與屬性值相同,表示為value。屬性是作為域成員在類中定義的。
實現一個delegate是很簡單的,通過以下3個步驟即可實現一個delegate:
- 聲明一個delegate對象,它應當與你想要傳遞的方法具有相同的參數和傳回值類型
2. 建立delegate對象,並將你想要傳遞的函數作為參數傳入。
3. 在要實現非同步呼叫的地方,通過上一步建立的對象來調用方法。
結合delegate的實現,我們可以將自訂事件的實現歸結為以下幾步:
1. 定義delegate物件類型,它有兩個參數,第一個參數是事件寄件者對象,第二個參數是事件參數類對象。
2. 定義事件參數類,此類應當從System.EventArgs類派生。如果事件不帶參數,這一步可以省略。
3. 定義事件處理方法,它應當與delegate對象具有相同的參數和傳回值類型。
4. 用event關鍵字定義事件對象,它同時也是一個delegate對象。
5. 用+=操作符添加事件到事件隊列中(-=操作符能夠將事件從隊列中刪除)。
6 在需要觸發事件的地方用調用delegate的方式寫事件觸發方法。一般來說,此方法應為protected訪問限制,既不能以public方式調用,但可以被子類繼承。名字是OnEventName。
7. 在適當的地方呼叫事件觸發方法觸發事件。
using System;
public class EventTest
{
// 步驟1,定義delegate對象
public delegate void MyEventHandler(object sender, System.EventArgs e);
// 步驟2省略
public class MyEventCls //監控處理事件執行的類
{
// 步驟3,定義事件處理方法,它與delegate對象具有相同的參數和傳回值類// 型
public void MyEventFunc(object sender, System.EventArgs e)
{
Console.WriteLine("My event is ok!");
}
}
// 步驟4,用event關鍵字定義事件對象
private event MyEventHandler myevent;
private MyEventCls myecls;
public EventTest()
{
myecls = new MyEventCls();
// 步驟5,用+=操作符將事件添加到隊列中
this.myevent += new MyEventHandler(myecls.MyEventFunc);
注意此處用得是+=,而不是Java中常見的.add。
}
// 步驟6,以調用delegate的方式寫事件觸發函數
protected void OnMyEvent(System.EventArgs e)
{
if(myevent != null)
myevent(this, e);
}
public void RaiseEvent()
{
EventArgs e = new EventArgs();
// 步驟7,觸發事件
OnMyEvent(e);
}
public static void Main()
{
EventTest et = new EventTest();
Console.Write("Please input ‘a‘:");
string s = Console.ReadLine();
if(s == "a")
{
et.RaiseEvent();
}
else
{
Console.WriteLine("Error");
}
}
}
event屬性支援add和remove關鍵字來代替get和set
C#中類的繼承只能單繼承,但可以通過介面實現多繼承。(類Java)
所以沒有虛基類的概念
基類中的建構函式與解構函式不可以被繼承。其餘的無條件被繼承。那些修飾符的限定,只是影響衍生類別中的成員對基類中成員的存取權限問題。
只有可訪問的方法才可以被重載。
Base訪問基類成員 密封類:sealed 一般和override連用
抽象類別可具體實現屬性,但介面中屬性與索引都僅僅是聲明,由相關類去實現。
介面純粹是一種設計運算式,類是設計與實現的集合。
如果類實現了某個介面,那麼一而繼承了其所有父介面。
隱藏介面屬性,但可以用完全限定名訪問父介面。
使用介面:如果事Crowdsourced Security Testing道某個類實現該介面,則可以通過類的對象直接進行訪問該介面。
數組:由類型相同的元素組成
Type Name[] 或者 Type[] Name
C#中數組的初始化運用new
聲明數組並不實際建立它們。在 C# 中,數組是對象,必須進行執行個體化。如果提供了初始值設定項,則還可以省略 new 運算子。
交錯數組:int[][] numbers = { new int[] {2,3,4}, new int[] {5,6,7,8,9} };
int[][] numbers = new int[][] { new int[] {2,3,4}, new int[] {5,6,7,8,9} };
訪問數群組成員可以直接進行,類似於在 C/C++ 中訪問數群組成員。
C# 還提供 foreach 語句。該語句提供一種簡單、明了的方法來逐一查看數組的元素。由於有了多維陣列,可以使用相同方法來逐一查看元素。
在 C# 中,數組實際上是對象。System.Array 是所有數群組類型的抽象基底類型。可以使用 System.Array 具有的屬性以及其他類成員。
數組常用方法:
Length屬性:表示數組所有維數中元素的總數。
Rank屬性:表示數組中的維數。
Sort方法:對一維數組排序。它是Array類的靜態方法.(意味著要通過Array類才可以訪問)
Reverse方法:反轉一維數組
GetLowerBound與GetUpperBound方法:數組指定維度下限與上限
Clear方法 重新初始化數組中所有的元素 將數組中的一系列元素設定為零、false 或Null 參考.
C#中數組大小是固定的。與Java類似。
集合:
列表:聲明:List<類型>列表名 其中類型可以使幾百呢類型,也可以是使用者自訂類型。
獲得其大小:List.Capacity既可以
搜尋元素:IndexOf() :用於搜尋列表中元素的索引號
LastIndexOf():用於搜尋列表指定元素的最後一個索引號
FindIndex():用於檢索元素在列表中出現的第一個位置
FindLastIndex():用於檢索元素在列表中出現的最後一個位置
Find():搜尋列表中匹配的第一個對象
FindLast():搜尋列表中匹配的最後一個對象
Exists():檢查元素是否存在
刪除集合元素:RemoveAt():按照索引鍵刪除指定元素
RemoveAll():刪除列表中所有元素
RemoveRange():從集合中刪除多個元素
Clear():清除列表中所有元素
.System.Collections中可以直接使用的集合類有:
ArrayList
實現了介面:IList、ICollection、IEnumerable
只要集合未被修改,ArrayList 就可安全地同時支援多個讀取器
隨著向 ArrayList 中添加元素,容量通過重新分配按需自動增加(2倍增加)
如果需要建立一個對象數組,但不能預Crowdsourced Security Testing道數組的大小,就可以使用ArrayList
ArrayList把所有元素都當作object對象引用,因而在訪問ArrayList的元素時要進行類型轉換
優點:動態改變大小、靈活方便的插入和刪除元素、可排序
缺點:插入時效能不如數組、不是強型別的
BitArray
實現了介面:ICollection、IEnumerable
管理位值的壓縮數組。
3)Hashtable
實現了介面:IDictionary、ICollection、IEnumerable
可以向Hashtable中自由添加和刪除元素,有些像ArrayList,但沒有那麼大的效能開銷
4)SortedList
實現了介面:IDictionary、ICollection、IEnumerable
SortedLIst兼顧了ArrayList和Hashtable的優點,可按索引值來排序
5)Queue
實現了介面:ICollection、IEnumerable
Queque是隊列,先進先出的訪問各個元素
可以調用Queque對象的GetEnumerator()方法,得到IEnumerator對象,來遍曆隊列中的各個元素
6)Stack
實現了介面:ICollection、IEnumerable
Stack是堆棧,後進先出的訪問各個元素
可以調用Stack對象的GetEnumerator()方法,得到IEnumerator對象,來遍曆堆棧中的各個元素
隊列:先進先出。在一段插入另一端刪除。
非泛型;System.Collections.Queue
泛型:System.Collection.Generic.Queue<T>
Enqueue 在隊的一端增加一個元素
Dequeue在隊的另一端讀取刪除一個資料
Peek()在隊裡的頭部讀取一個資料,但不刪除他
Count:返回隊列中元素的額個數
TrimExccess():重新設定隊列的容量。因為Dequeue讀取刪除資料,但會留下空元素繼續佔位。
Contains:確定某個元素是否在隊列中
CopyTo:將元素從隊列中複製到一個已有的數組
ToArray:返回一個包含隊列元素的新數組
棧(Stack):先進先出 push()出棧 pop()進棧
鏈表:物理上散存,邏輯上連續的
List:返回與節點相關的LinkedList
Next:返回下一個節點
Previous:返回上一個節點
Value:返回與節點相關的元素,其類型為T
Cout First Last AddAfter() Addbefore()AddFirst() AddLast()
Remove() RemoveFirst() RemoveLast()
Clear() contains()
Find()從鏈表的開頭搜尋傳給他的元素
FindLast() 從鏈表的尾部開始尋找
有序表(SortedList):key與values屬性的集合對鍵和值進行高效的索引檢索
ContainsKey(),ContainsValue 用於檢查是否包含指定的Key活Value
TryGetValue