c 專題 靜態成員

2021-10-06 11:51:42 字數 4892 閱讀 8058

1、靜態字段

靜態字段用於多個例項共享的資料,類似全域性變數,使用類名.成員名的形式來訪問,看**:

class

statistics

}

statistics sta1 =

newstatistics(1

);statistics sta2 =

newstatistics(1

);console.

writeline

(statistics._count)

;

上述程式輸出的 結果是2,因為靜態變數被多個類的例項共享,所以每次例項化statistics都會將靜態欄位_count加上傳入建構函式的值。

2、靜態方法

當我們定義乙個方法不需要訪問任何例項資料時使用靜態方法,否則使用例項方法。

1)

class

statistics

public

static

void

showresult()

//靜態方法定義

}

方法呼叫:

statistics.

showresult()

;

2)在靜態方法中怎麼去訪問例項成員

class

statistics

public

static

void

showresult()

public

static

void

accessnostaticdata()

//靜態方法

}非靜態類

class

testnostatic

}

呼叫靜態方法

statistics.

accessnostaticdata()

;

3、靜態構造器

class

statistics

public

statistics

(int count)

public

static

void

showresult()

public

static

void

accessnostaticdata()

//靜態方法

}

console.

writeline

(statistics._count)

;

輸出結果為100,說明在訪問靜態欄位_count 時執行了靜態建構函式,這個訪問發生在靜態欄位_count本省的初始化賦值之後,c#6.0本質論中指出,盡量不要使用靜態構造器,而是直接考慮以內聯的方式初始化靜態字段,查閱了很多資料,都說在宣告並對靜態字段賦值就是以內聯的方式初始化靜態字段,如下,如有問題請指出:

class

statistics

public

static

void

showresult()

public

static

void

accessnostaticdata()

//靜態方法

}

4、靜態屬性

public

static

int age

=100

;

盡量使用靜態屬性代替靜態字段,畢竟靜態屬性還有一定程度的封裝;

5、靜態類

如果乙個類完全沒有例項成員,那麼就將這個類宣告成靜態的,如下:

static

class

statistics

=100

;//靜態屬性

public

static

void

showresult()

//靜態方法

public

static

void

accessnostaticdata()

//靜態方法

}

靜態類不可繼承,無法例項化

6、擴充套件方法

public

class

testnostatic

}public

static

class

testextendmethod

//擴充套件方法所在的類的型別並不重要

}

//呼叫:

testnostatic test =

newtestnostatic()

; test.

extendmethod()

;

擴充套件方法一般和介面配合使用,否則很少用它。

7、封裝資料

主要是指兩個字段修飾符,乙個是const乙個是readonly。

1)const

常量字段用於用於修飾恆定的量,比如圓周率,被const修飾的字段在程式中無法再被改變,如下:

private

const

double pi = math.pi;

2)readonly

public

class

testnostatic

}public testnostatic (

int id)

public

void

showdata()

//例項方法

}

呼叫:

testnostatic test =

newtestnostatic

(200);

console.

writeline

(test.id )

;

輸出值為200,因為這個唯讀的字段只能從構造器中去修改。

注意:在c#6.0中其實不需要readonly修飾符,直接使用唯讀的自動實現的屬性就好。

如下:public string name = 「小王」;

注意:對於屬性陣列,有如下特性,對於陣列型別的屬性而言,系統認為對屬性的賦值是改變陣列的個數而不是改變陣列中元素的值。

public

bool

cell

=new

bool[2

];

cell[0]

=false

;//可以賦值

cell[1]

=false

;//可以賦值

cell =

newbool[3

];//不可以賦值

8、巢狀類

public

class

testnostatic

private

class

inner

//巢狀類

}}

呼叫

testnostatic test =

newtestnostatic()

; test.

showmethod()

;

我們可以看到巢狀類inner的訪問修飾符是private,在命名空間下的類的訪問修飾符不能宣告為private,也只有在是巢狀類的時候才可以,將巢狀類宣告為private,這樣就避免了被別的類訪問,我們宣告巢狀類的時候也是因為這個類宣告在它的包容類外面沒有意義的時候才將它宣告為巢狀類,並且有以下幾個特點:

1)避免將巢狀類宣告為public;

2)巢狀類中的this代表巢狀類而不是包容類的例項;

3)巢狀類能訪問包容類中任何成員,包括私有成員;

4)包容類不能訪問巢狀類的私有成員;

但是如果碰到了巢狀類宣告為public的情況,我們使用方式如下:

public

class

testnostatic

public

class

inner

//巢狀類

}}

這裡注意我們不能直接寫成如下形式,會報錯:

inner inner = new inner();//報錯,也就是說inner即使宣告為pulic也是直接訪問不了的,必須用如下形式:

testnostatic.inner inner =

newtestnostatic.inner()

; inner.

showmethod()

;

9、分部類和分部方法

partial

class

parta

partial

void

showpart()

;//分部方法不能有訪問修飾符,這是在乙個類中定義分部方法

}partial

class

parta

partial

void

showpart()

//在另乙個類中實現分部方法。

}

1)分部類用partial 修飾;

2)分部方法在分部類中;

3)分部方法不能使用訪問修飾符,預設private或者protect,有待驗證;

4)分部方法在使用時乙個類中宣告,另乙個類中實現,當然也可以只宣告但是不實現,如果不實現,但是方法也被呼叫了,但是程式不會報錯,程式選擇了直接跳過這段**。

C 靜態成員變數,靜態成員函式

資料成員可以分靜態變數 非靜態變數兩種.靜態成員 靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名 靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員不能訪問非靜態的成員.因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中靜...

C 靜態成員 2 靜態資料成員

目錄 1.靜態成員的構造 2.靜態成員的訪問 3.靜態成員的初始化 include class a class b int main 輸出 b s constructor called 結論 程式只呼叫了b的建構函式,而沒有呼叫a的建構函式。原因很簡單,靜態成員僅僅在類宣告的時候而宣告,但是不會定義...

C 靜態成員和靜態成員函式

一 靜態資料成員 類體中的資料成員的宣告前加上static關鍵字,該資料成員就成為了該類的靜態資料成員。和其他資料成員一樣,靜態資料成員也遵守public protected private訪問規則。同時,靜態資料成員還具有以下特點 1 靜態資料成員的定義。靜態資料成員實際是類域中的全域性變數,其定...