C中的靜態變數和常量有什麼具體的區別?請詳細說一下,我看了概念總感覺這兩者很像

2021-04-19 08:42:14 字數 4336 閱讀 1060

1樓:匿名使用者

靜態變數

來也是變數,但就這自一點就和常量

不一bai樣;常量的du值是不可改變的,zhi在程式運dao行的時候就已經決定了它的值;

但是靜態變數的值是可以在執行時被更改的,它們唯一的共同點只是在程式的一開始就存在於記憶體當中,僅此而已

2樓:匿名使用者

靜態用於多個客戶端訪問同樣的資料 例如電影院買票系統

常量用於在程式中永遠不會變化的數值或者其他型別的變數 例如 圓周率 等同於c語言裡面的巨集定義

3樓:匿名使用者

static變數初始bai值一定要是常量du。 static變數中文名叫靜態zhi變數。它與普通dao的變數比起內來有如下容幾個區別:

1)位置:靜態區域性變數被編譯器放在全域性儲存區.data,所以它雖然是區域性的,但是在程式的整個生命週期中存在。

4樓:匿名使用者

static和const,都會導致編譯器bai在生成時直接du分配如:static int x=1;

const int y=1;

則if (x=y)編譯器將處zhi理成if(1=1)區別dao在於使用方式:

static變數版通權過型別應用,使用static變數不需要初始化類,而const變數必須在類被初始化以後才能被使用。

即:static變數=型別應用

const變數=例項應用

5樓:匿名使用者

是像..

但是靜態的可以改

常量更改會報錯

親,您說是不?

c# 中如何宣告一個靜態常量?

6樓:

常量隱含著就是靜態的,所以,不用特別說明 static.

**改為這樣:

class program

{public const string success = "1";

.........

7樓:匿名使用者

c#擁有兩種不同的常量:靜態常量(compile-time constants)和動態常量(runtime constants)。它們有不同的特性,錯誤的使用不僅會損失效率,還可能造成錯誤。

相比之下,靜態常量在速度上會稍稍快一些,但是靈活性卻比動態常量差很多。

//靜態常量(隱式是靜態的)

public const int compiletimeconstant = 1;

//動態常量

public static readonly runtimeconstant = 1;

靜態常量在編譯時會將其替換為所對應的值,也就是說下面這2句話通過編譯器編譯後產生的il是一樣的。

//通過編譯後二者會被翻譯成相同的中間語言

int mynum = compiletimeconstant;

int mynum = 1;

動態常量的值是在執行時獲得的。il中將其標為只讀常量,而不是用常量的值代替。

靜態常量只能被宣告為簡單的資料型別(內建的int和浮點型)、列舉或字串。下面的程式段是通不過編譯的。你不能用new關鍵字初始化一個靜態常量,即便是對一個值型別來說。

//這樣是錯誤的

public const datetime mydatetime = new datetime(2006,9,1,0,0,0);

//這樣是可以的

public static readonly datetime mydatetime = new datetime(2006,9,1,0,0,0);

只讀資料也是常量的一種,它們不能在構造器初始化之後被修改。但是它同靜態常量不同,它的值是在執行時才被指派的,因此就會獲得更大的靈活性。動態常量可以是任意的資料型別。

二者最大的差別在於:靜態常量在編譯時會將其換為對應的值,這就意味著對於不同的程式集來說,當你改變靜態常量的時候需要將其重新編譯,否則常量的值不會發生變化,可能引發潛在的問題,而動態常量就不會有這種情況。

用const定義的常量(隱式是靜態的),需要像訪問靜態成員那樣去訪問const定義的常量,而用物件的成員方式去訪問會出編譯錯誤。 宣告的同時要設定常量值。

從另一方面來說,如果你的確要宣告一些從不改變且處處唯一的常量,例如鉤子函式setwindowshookex的idhook引數或序列化時的版本等,就應該使用靜態常量。但是用到這樣的常量的機會不多。一般來說我們應該使用靈活性更高的動態常量。

靜態常量 動態常量

記憶體消耗 無 因為要儲存常量 有消耗

初始化 很少的簡單型別, 任意型別,可以在類建構函式中賦值

不能new,必須在

宣告同時賦值

何時發揮作用 編譯時進行替換 相當於類中的資料成員

8樓:『戀愛領域

你申明的這個靜態變數在哪申明的?必須在類裡!

9樓:匿名使用者

const就是靜態常量

c#中靜態變數和方法用什麼用處

10樓:匿名使用者

1.靜態變數

在c#程式中,沒有全域性變數的概念,這意味著所有的成員變數只有該類的例項才能操作這些資料,這起到了「資訊隱藏」的作用。但有些時候,這樣做卻不是個明智的選擇。

假設我們要定義一個圖書類,要求該類能儲存圖書的數量,即每增加一本圖書(定義一個例項),圖書的數量應該加1。如果沒有靜態變數,我們需要將圖書的數量儲存在每本圖書(例項)裡,然而,這樣的變數要在不同圖書(例項)裡重複儲存,圖書(例項)數量少的話,我們還能接受,如果圖書(例項)數量較多的話,比如成千上萬,我們無法想象這要造成多少資源(如記憶體、磁碟空間)的浪費,更讓人無法忍受的是:因為圖書(例項)的數量要儲存在每本圖書(例項)裡,該值肯定是不同的。

要使這些圖書(例項)中儲存的圖書(例項)數量一致,我們必須在每增加一本新書(生成一個新例項)時,修改其他所有圖書(例項)中儲存的該值。oh,my god!你會重新嚮往程序導向的程式設計方法,嚮往擁有全域性變數的時代。

但,這種局面不會出現,因為c#中為你準備好了另外一種變數型別:靜態變數。它在類中類似全域性變數,儲存類的公共資訊,所有該類的例項(物件)共享該值。

靜態變數的宣告方式如下:

[訪問修飾符] static 資料型別 變數名;

這裡的訪問修飾符跟類的其它成員一樣,可以是public,protected,private或internal等。

靜態變數又如何使用呢?

靜態變數必須使用類名來引用,而不能使用類的例項,因為,靜態變數不屬於任何例項,而是共有的。我們可以打個比方:在一個班級中,有些物品是個人的,我們想使用時,必須指出物品的所有者,比如說「王三的自行車」,在c#程式中我們可以使用:

王三.自行車的格式。有些物品是大家共有的物品,不能以個人名義使用,而是用班級的名義使用,比如班集體出資買的籃球,只能說:

「班級的籃球」,而不能說:「王三的籃球」。這絕對是不行的,這對其他人絕對是不公平的,我們可以聯想到許多**汙吏就是使用了不屬於自己的東西,或以個人名義使用公家的東西而葬送了自己。

說一句有用的就是:靜態變數是用類名來引用它。即:類名.靜態變數名;

舉個具體的例子如下:

using system;

class staticvar

",x);

console.writeline("靜態變數y = ",y);}}

class test

}程式中被註釋的部分:stv.y = 20是使用例項引用靜態變數,這將引發錯誤。

另外,我想說一句,對於靜態變數在宣告時,如果沒有給出初始值或使用前沒有賦任何值的話,系統會給他們一個預設值:對於整型資料預設值為0;單精度資料為:0.

0f;雙精度資料為0.0;布林型資料為false;引用型資料為null。

2.靜態方法

靜態方法與靜態變數一樣,不屬於任何特定的例項,屬於類全體成員共有,由類名來呼叫。但要注意以下幾點:

靜態方法只能訪問類的靜態成員,不能訪問類的非靜態成員;

非靜態方法可以訪問類的靜態成員,也可以訪問類的非靜態成員;

靜態方法不能使用例項來呼叫,只能使用類名來呼叫。這裡用一個具體的例子來說明:

using system;

namespace teststatic

public void ******print()

public static void staticprint()

",y);

// console.writeline("x=",x); //靜態方法中不能使用非靜態成員}}

class test} }

11樓:匿名使用者

說實話,沒什麼用處,那不是oo的東西,會影響程式的結構

關於C 的靜態變數用法

返回的是7的 函式在呼叫的時候,實參是參與到函式的運算當中的。這裡,你的這句表述的是正確的 還是說執行的時候直接把a 2帶入到呼叫函式中計算,呼叫函式中計算完後直接返回一個7 這裡的函式呼叫跟靜態變數沒有關係的,函式內的靜態變數的用法,可以參考下面的 1 靜態區域性變數在函式內定義,但不象自動變數那...

C中靜態方法和非靜態方法的區別

c 靜態方法與非靜態方法的區別不僅僅是概念上的,那麼他們有什麼具體的區別呢?讓我們通過本文向你做一下解析。c 的類中可以包含兩種方法 c 靜態方法與非靜態方法。那麼他們的定義有什麼不同呢?他們在使用上會有什麼不同呢?讓我們來看看最直觀的差別 使用了static 修飾符的方法為靜態方法,反之則是非靜態...

在php中預定義的常量和變數是怎麼使用和輸出的

line 檔案中的當前行號。file 檔案的完整路徑和檔名。如果用在包含檔案中,則返回包含檔名。自 php 4.0.2 起,file 總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。true true與false是php中的判斷結果,ture表示結果為真,false為假.e parse...