C Static用法大彙總

2021-06-17 19:33:48 字數 4809 閱讀 1038

c#static用法大彙總  

2010-05-06 12:11:20|  分類: c# |字型大小 訂閱

靜態變數

當我們編寫乙個類時,其實就是在描述其物件的屬性和行為,而並沒有產生實質上的物件,只有通過new關鍵字才會產生出物件,這時系統才會分配記憶體空間給物件,其方法才可以供外部呼叫。

有時候,我們希望無論是否產生了物件或無論產生了多少物件的情況下,某些特定的資料在記憶體空間裡只有乙份,例如所有的中國人都有國家名稱,每乙個中國人都共享這個國家名稱,不必在每乙個中國人的例項物件中都單獨分配乙個用於**國家名稱的變數。例子:

protected void page_load(object sender, eventargs e)

class chinese

}需要注意的是:不能把任何方法體內的變數宣告為靜態,如下面這樣是不行的:

public void getcountry()

靜態方法

我們有時也希望不必建立物件就可以呼叫某個方法,換句話說也就是使該方法不必和物件繫結在一起。要實現這樣的效果,只需要在類中定義的方法前加上static關鍵字就可以了,我們稱這種方法為靜態成員方法,還可以在類的非靜態成員方法中象訪問其他靜態方法一樣去訪問這個靜態方法,例子:

protected void page_load(object sender, eventargs e)

class chinese

}注意:在靜態方法裡只能直接呼叫同類中其他的靜態成員(包括變數和方法),而不能直接訪問類中的非靜態成員。這是因為,對於非靜態的方法和變數,需要先建立類的例項物件後才可以使用,而靜態方法在使用前不用建立任何物件。

const和static readonly的確很像:通過類名而不是物件名進行訪問,在程式中唯讀等等。在多數情況下可以混用。

二者本質的區別在於,const的值是在編譯期間確定的,因此只能在宣告時通過常量表示式指定其值。而static readonly是在執行時計算出其值的,所以還可以通過靜態建構函式來賦值。

要理解static,就必須要先理解另乙個與之相對的關鍵字,很多人可能都還不知道有這個關鍵字,那就是auto,其實我們通常宣告的不用static修飾的變數,都是auto的,因為它是預設的,就象short和long總是預設為int一樣;我們通常宣告乙個變數:

int a;

string s;

其實就是:

auto int a;

auto string s;

而static變數的宣告是:

static int a;

static string s;

這樣似乎可以更有利於理解auto和static是一對成對的關鍵字吧,就像private,protected,public一樣;

對於static的不理解,其實就是對於auto的不理解,因為它是更一般的;有的東西你天天在用,但未必就代表你真正了解它;auto的含義是由程式自動控制變數的生存週期,通常指的就是變數在進入其作用域的時候被分配,離開其作用域的時候被釋放;而static就是不auto,變數在程式初始化時被分配,直到程式退出前才被釋放;也就是static是按照程式的生命週期來分配釋放變數的,而不是變數自己的生命週期

c#靜態變數使用 static 修飾符進行宣告,在類被例項化時建立,通過類進行訪問;不帶有 static 修飾符宣告的變數稱做非靜態變數。static變數在物件被例項化時建立,通過物件進行訪問乙個類的所有例項的同一c#靜態變數都是同乙個值,同乙個類的不同例項的同一非靜態變數可以是不同的值。靜態函式的實現裡不能使用非靜態成員,如非靜態變數、非靜態函式等。

例子1:

code

#region//類a b中都含有static變數 建構函式

class a

//static void main()

//,y=", a.x, b.y);//x=2,y=1

// console.readline();

//}}

class b

static void main()

,y=", a.x, b.y);//x=1,y=2

console.readline();}}

#endregion

解釋:程式入庫main()位於類b中,因此類b首先進行初始化,次序為 int y, 在對y的賦值中使用到了類a,所以跳轉到類a中,同樣類a中的成員進行初始化,自域x開始這裡為0,到靜態建構函式x=b.y+1,此時b.y=0,所以x=1;然後->public static int y = a.x + 1; ---》 得出y=2.

例子2.

code

#region//類class1中既有 static變數和建構函式也有非 static的建構函式

class class1

public class1()

}#endregion

class program

}解釋:在 class1 c1 = new class1();例項化c1的時候,到class1中例項化成員,次序是static變數,static建構函式,最後是非static建構函式;此時count=2;

在 class1 c2 = new class1(); 例項化c2時,因為static的變數,建構函式不再被執行,所以只執行非靜態建構函式,所以這裡count++一次;count=3.

c# static -靜態方法與靜態變數的用法

範例1:

using system;

class class1}}

個人總結:靜態方法與靜態變數要直接使用類名+靜態成員名訪問,非靜態方法與靜態變數要用類的例項+靜態成員名來訪問。

c#不允許宣告函式體內的static變數

c#居然不支援在函式體內宣告static變數,這真的是很古怪,難道乙個static變數的就一定要讓別人知道嗎(至少會被類的其他成員知曉)?

下邊的c#和c++的比較,很明顯,c++在這一點上要合理很多,uniqueid這個不斷遞增、控制著唯一id的重要變數,永遠不會被類裡的其他成員無意破壞掉,不知道為什麼c#不允許這種「函式體內部的static變數「,狂汗……

//下面是c#**,uniqueid_只能是類的靜態成員//而不能是foo()函式的函式體內靜態成員class foo

private static int uniqueid_ = 0;

private int id_;};

//下面是c++**,uniqueid可以是函式體內的靜態變數//這樣,它僅在本函式體內可見。

class foo

private:    int id_;

}靜態變數和私有變數的最主要的區別就在於:他們分配記憶體空間的方式不一樣。

靜態變數的記憶體是在程式開始執時變數就占用了記憶體,直到程式結束時變數才釋放記憶體.

私有變數(或者說是區域性變數,不知道你是不是指這個:)),是在程式執行到該步的時候分配記憶體。所以,當離開了該私有變數的作用域的時候,私有變數的記憶體空間會被釋放。

所以:靜態變數只的值只會初始化一次,後面每次訪問,都是上次處理過的值,(即使是在乙個函式內部)。 私有變數每次都初始化。

看下面的實踐:

class program

}class sort

}總結:在類內部訪問靜態變數時,直接用靜態變數名即可,不用以(類名.靜態變數名),這樣的方式訪問,

除了有靜態變數之外,還有靜態類例項,還有靜態方法.但用法都是大同小異;(沒有靜態類哦,呵呵越論越傻了)

如:public static void myfun(){}   //靜態方法

private static random myrandom=new random(); //靜態類例項

之所以有時宣告為私有靜態變數,是為了讓它只初始化一次.這樣節省了記憶體空間

但又想讓它在外部是不可訪問的,這樣利用私有這個訪問限定符就搞定了.

私有靜態:安全又節省空間.

例:如果想在每次例項化類的時間生成一組隨機數,但產生隨機數是要用到乙個類的,即random,這個類不是靜態類,它要產生例項,用產生的例項來生成隨機數,但如果在每次類例項化時都產生乙個random例項,那記憶體空間簡直是極大的浪費,所以可以用:

private static random myrandom=new random();

這樣每次類例項化時,都會用同乙個random例項myrandom來產生隨機數

靜態方法:

靜態方法是不屬於特定物件的方法,靜態方法可以訪問靜態成員變數,靜態方法不可以直接訪問例項變數,可以在例項函式呼叫的情況下,例項變數做為引數傳給靜態方法。靜態方法也不能直接呼叫例項方法,可以間接呼叫,首先要建立乙個類的例項,然後通過這一特定物件來呼叫靜態方法。

例項方法:

乙個例項方法的執行與特定物件關聯,他的執行需要乙個物件存在。例項方法可以直接訪問靜態變數和例項變數,例項方法可以直接訪問例項方法、和靜態方法,靜態方法的訪問方式為類名加點操作符加變數名。當多個例項物件存在時,記憶體中並不是存在某個特定的例項方法的拷貝,而是,相同類的所有物件都共享每個例項方法的乙個拷貝(例項方法只占用「一套」空間)。

問題1:能不能用乙個例子來說明,靜態方法如何不可以直接訪問例項變數,但可以在例項函式呼叫的情況下,例項變數做為引數傳給靜態方法?

例1:class   a

}例2:

namespace   cppshooter

public   static   int   add(int   a,   int   b)

}public   class   b}}

靜態方法是有類的時候就有的,沒辦法知道這個類有沒有例項.也就是說,靜態方法,並不知道例項變數是不是存在 ,當然就不能呼叫了

2.例項方法可以直接訪問靜態變數和例項變數

public   class   a

public   void   popadd()

public   static   int   add(int   a,   int   b)

}

C static的用法詳解

有的東西你天天在用,但未必就代表你真正了解它,正如我之前所了解的 static 一 靜態類 靜態類與非靜態類的重要區別在於靜態類不能例項化,也就是說,不能使用 new 關鍵字建立靜態類型別的變數。在宣告乙個類時使用static關鍵字,具有兩個方面的意義 首先,它防止程式設計師寫 來例項化該靜態類 其...

c static 關鍵字用法

一 static 變數 static變數大致分為三種用法 1.用於區域性變數中,成為靜態區域性變數.靜態區域性變數有兩個用法,記憶功能和全域性生存期.2.用於全域性變數,主要作用是限制此全域性變數被其他的檔案呼叫 3.用於類中的成員.表示這個成員是屬於這個類但是不屬於類中任意特定物件 1.靜態區域性...

C static關鍵字用法

1.全域性靜態變數 在全域性變數前加上關鍵字static,全域性變數就被定義成為全域性靜態變數,存放在靜態儲存區,在整個程式的執行期間一直存在 初始化 未初始化的全域性靜態變數會被自動初始化為0 自動物件的值是任意的,除非他被顯示初始化 作用域 作用域發生改變,僅在當前檔案中有效。2.區域性靜態變數...