.NET零散筆記[2]
可以不用強制類型轉換,用as來替代,這樣做的好處是:如果轉換是非法的,不會產生異常,只是產生一個值為null的轉換結果。比如:Person p=new Person();
Student s= p as Student;
Console.WriteLine("p={0}", c==null ? "null" : c.ToString());
類的成員包括:字段;方法:屬性(智能字段);常量;索引器(智能數組);事件;操作符重載。
C#中對于類中定義的字段,如果前面不加限定符,則默認為private。
C#中和Java一樣,對于字段或方法的定義,都是在每一個前面都要加限定符!
C#中多了一個internal限定符,表示該成員只在當前編譯單元內可見,根據代碼所在的位置,訪問限定符“internal”代表了“public”和“protected”的訪問性組合。
C#中調用基類的構造函數用base而不是super,而且調用位置也不同于Java,還是繼承了C++的傳統寫法,如:
public B(int x) : base(x)
C#中readonly關鍵字和Java中的final差不多,都是定義常量用的,但是它定義的常量可以在構造函數內初始化,而const定義的常量只能在定義時初始化。如果再用static限定,那么也可以在static塊中初始化。
C#中用限定符“sealed”來禁止一個類派生子類,和Java中的final關鍵字修飾一個類時的作用一樣。
C#中用ref和out兩個關鍵字來使得函數參數可以帶回返回值。ref和C++中用“&”定義的引用一樣,如:
public void change(ref int x,ref int y){
int tmp=x;
x=y;
y=tmp;
}
在調用時也得change(ref x,ref y);但需要注意的是,x和y這兩個變量必須被事先初始化。
使用out時,就不必初始化了,使用方法同ref。關鍵是要區別什么時候用ref什么時候用out。其實剛才在上面舉的例子,一定要用ref,因為這個函數在處理時需要用到參數已有的值來交換,如果沒有初始值,那還交換個什么勁兒啊,而如果我們只是希望通過函數調用帶回來一些信息給我們使用,也就是想實現多返回值,僅僅出于此目的且函數處理中不必利用參數的初始值,那么就應該使用out。
C#中用“params”關鍵字來使得方法的參數個數可變,相當于在Java里定義函數時使用...效果一樣。如:
public int sum(params int[] x)。但必須定義為數組類型。而在Java中這樣就行:public int sum(int ... x)
C#中函數覆蓋時,必須用關鍵字new來修飾,否則A.max()和B.max()各調用各自的,誰也不干涉誰(這里B派生自A)。
C#中要實現多態,必須在基類定義函數時用關鍵字virtual修飾,在子類中覆蓋函數時用override修飾。而且被virtual修飾的基類函數還不能是private的,因為它對子類不可見。
C#中定義抽象類或抽象方法,也都是用abstract關鍵字聲明,但是在子類實現時必須用override關鍵字修飾要實現的抽象函數。
C#中可以用foreach(int tmp in x)來實現類似Java中for(int tmp : x)的功能。
C#中用get和set關鍵字來得到、設置類的屬性,這期間還會用到關鍵字value。舉個例子如下:
protected string zipCode;
public string ZipCode
{
get
{
return zipCode;
}
set
{
zipCode=value;
}
}
這里ZipCode是一個屬性名,可以隨便起名字,但是為了和字段相匹配,我們給它起名為“ZipCode”。在使用時就得這樣:
Address addr=new Address();
addr.ZipCode="55555";
string zip=addr.ZipCode;
C#中不能夠在類中定義對象的時候就用new為其賦值!!!!!
C#中定義多維數組用int [, ,] x;多維數組得到某一維的長度用x.GetLength(第幾維);查詢多維數組的維數用x.Rank;
C#中用int [][] x;來定義二維的“鋸齒狀數組”,這同Java是一樣的,這種鋸齒狀數組當然包括常規的二維數組了,但是在Java中并沒有對它們進行區分。
================索引器================
簡單說來,所謂索引器就是一類特殊的屬性,通過它們你就可以像引用數組一樣引用自己的類。
聲明方法如下(與屬性相似):
//修飾符 類型名稱 this [類型名稱 參數名]
public type this [int index]
{
get
{
//...
}
set
{
//...
}
}
用例子簡單說明:
using System.Collections;
static void Main(string[] args)
{
//調用IntBits.IntBits方法,意為將63賦給bits
IntBits bits = new IntBits(63);
//獲得索引6的bool值,此時 bits[6]將調用索引器"public bool this[int index]"中的Get,值為True
bool peek = bits[6];
Console.WriteLine("bits[6] Value: {0}",peek);
bits[0] = true;
Console.WriteLine();
Console.ReadKey();
}
struct IntBits
{
private int bits;
public IntBits(int initialBitValue)
{
bits = initialBitValue;
Console.WriteLine(bits);
}
//定義索引器
//索引器的“屬性名”是this,意思是回引類的當前實例,參數列表包含在方括號而非括號之內。
public bool this [int index]
{
get
{
return true;
}
set
{
if (value)
{
bits = 100;
}
}
}
備注:
所有索引器都使用this關鍵詞來取代方法名。Class或Struct只允許定義一個索引器,而且總是命名為this。
索引器允許類或結構的實例按照與數組相同的方式進行索引。索引器類似于屬性,不同之處在于它們的訪問器采用參數。
get 訪問器返回值。set 訪問器分配值。
this 關鍵字用于定義索引器。
value 關鍵字用于定義由 set 索引器分配的值。
索引器不必根據整數值進行索引,由您決定如何定義特定的查找機制。
索引器可被重載。
索引器可以有多個形參,例如當訪問二維數組時。
索引器可以使用百數值下標,而數組只能使用整數下標:如下列定義一個String下標的索引器
public int this [string name] {...}
屬性和索引器
屬性和索引器之間有好些差別:
類的每一個屬性都必須擁有唯一的名稱,而類里定義的每一個索引器都必須擁有唯一的簽名(signature)或者參數列表(這樣就可以實現索引器重載)。
屬性可以是static(靜態的)而索引器則必須是實例成員。
為索引器定義的訪問函數可以訪問傳遞給索引器的參數,而屬性訪問函數則沒有參數。
posted on 2008-02-28 20:55 so true 閱讀(343) 評論(0) 編輯 收藏 所屬分類: .NET