在c中如何編寫定義常量p,並賦值

2021-03-03 21:12:32 字數 4330 閱讀 2210

1樓:匿名使用者

public const double pi = 3.1415926;

只是圓周率的話,直接使用 math.pi 更方便些

c#裡如何定義常量集合

2樓:陽光的雷咩咩

3樓:匿名使用者

在程式裡用dictionary,如果用作外部檔案可以用ini或xml都可以

c#介面中怎麼定義常量啊?

4樓:go陌小潔

c#中定義常量的方式有兩種,一種叫做靜態常量(***pile-time constant),另一種叫做動態常量(runtime constant)。前者用「const」來定義,後者用「readonly」來定義。 對於靜態常量(***pile-time constant),它的書寫方式如下:

public static const int max_value = 10;

用const定義的常量,對於所有類物件而言都是一樣的,因此需要像訪問靜態成員那樣去訪問const定義的常量,而用物件的成員方式去訪問會出變異錯誤。此外,對於靜態常量的訪問在編譯的時候,是用常量的值去替換常量,例如:

int nvalue = max_value;

這句在編譯之後,和如下這句所產生的中間語言**是一樣的。

int nvalue = 10;

不過,在用const來定義常量的時候,在型別上有很多限制。首先,此型別必須屬於值型別,同時此型別的初始化不能通過new來完成,因此一些用struct定義的值型別常量也不能用const來定義。

相對於const而言,用readonly來定義常量要靈活的多,它的書寫方式如下:

public readonly int max_value = 10;

為什麼稱為動態變數,因為系統要為readonly所定義的常量分配空間,即和類的其他成員一樣擁有獨立的空間。此外,readonly所定義的常量除了在定義的時候可以設定常量值外,還可以在類的建構函式中進行設定。由於readonly所定義的常量相當於類的成員,因此使用const來定義常量所受到的型別限制,在使用readonly去定義的時候全部消失,即可以用readonly去定義任何型別的常量。

綜合上面所述,至於對比兩者之間的區別具體如下。

靜態常量(***pile-time constant) 動態常量(runtime constant)

定義宣告的同時要設定常量值。宣告的時候可以不需要進行設定常量值,可以在類的建構函式中進行設定。

型別限制

首先型別必須屬於值型別範圍,且其值不能通過new來進行設定。 沒有限制,可以用它定義任何型別的常量。

對於類物件而言 對於所有類的物件而言,常量的值是一樣的。 對於類的不同物件而言,常量的值可以是不一樣的。 記憶體消耗無。 要分配記憶體,儲存常量實體。

綜述效能要略高,無記憶體開銷,但是限制頗多,不靈活。 靈活,方便,但是效能略低,且有記憶體開銷。

對於在定義常量的時候,到底是用const來定義還是readonly來定義,我以前為了追求效能,因此儘量用const來定義。但是在此書中,提到了一個關於使用const會產生潛在的bug。就是在程式中使用dll類庫某個類的靜態常量時,如果在類庫中修改靜態常量的值,其它介面沒有發生變化,一般來說,程式呼叫端是不需要重新編譯,直接執行就可以呼叫新的類庫。

不過就是在此情況下,會產生潛在的bug。這是由於靜態常量在編譯的時候,是用它的值去替換常量,因此在呼叫端的程式也是這樣進行替換的。例如:

在類庫中定義了一個靜態常量,如下:

public const int max_value = 10;

那麼對於程式中呼叫此靜態常量這段**,在編譯後產生的中間語言**中,是用10來進行替換,即使用靜態常量的地方,改為10了。 那麼當類庫的靜態變數發生變化後,例如:

public const int max_value = 15;

那麼對於呼叫端程式是可以在沒有重新編譯的情況下進行執行,不過此時程式的中間語言**對應於靜態變數的值是10,而不是新類庫中的15。因此這樣產生的不一致,程式會引發潛在的bug。解決此類問題的方法,就是呼叫端程式在更新類庫之後重新編譯一下,即生成新的中間語言**。

對於如上在const定義常量時所存在的潛在bug,在用readonly定義常量時是不會發生的。因為readonly定義的常量類似於類的成員,因此在訪問的時候需要根據具體常量地址來訪問,從而避免此類bug。

5樓:魔淚無痕

const 是定義常量的關鍵字,定義常量和定義變數唯一的不同就是多加一個const。

如,int i=1;//定義並賦值一個變數const int i=5;//定義一個常量並賦值。

定義常量時必須同時對常量賦值,但定義變數時可不用賦值。

6樓:匿名使用者

介面,不可以定義欄位!

7樓:匿名使用者

主要是const標識 例:const int max_value = 10;

8樓:

private readonly const string str="123"; 宣告一個值為123的常量

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

9樓:

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

**改為這樣:

class program

{public const string success = "1";

.........

10樓:匿名使用者

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

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

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

public const int ***piletimeconstant = 1;

//動態常量

public static readonly runtimeconstant = 1;

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

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

int mynum = ***piletimeconstant;

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,必須在

宣告同時賦值

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

11樓:『戀愛領域

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

12樓:匿名使用者

const就是靜態常量

C如何定義類型別的陣列,C 中如何定義類的陣列,以及給他們賦值?

student 學生物件的陣列 liststu new list 學生物件的集合 c 中自定義類陣列和結構陣列的使用 發現很多時候給定的陣列要實現某個邏輯或處理很是麻煩,一維陣列,二維陣列,等等需要經過n多轉換,還不如自己寫一個自定義陣列,既方便又節省時間,以下是類陣列,其實相當於定義了一個實體類一...

在C中怎麼定義int的長度

int 關鍵字表示一種整型,該型別根據下表顯示的大小和範圍儲存值。範圍 2,147,483,648 到 2,147,483,647 大小 有符號 32 位整數 可以宣告並初始化 int 型別的變數,例如 int i 123 如果整數沒有字尾,則其型別為以下型別中可表示其值的第一個型別 int uin...

排序並插入題目內容編寫程式,在主函式中定義有

include define n 10 函式前置宣告 int sortarr int p,int n int printarr int p,int n 氣泡排序 int sortarr int p,int n return 0 列印陣列 int printarr int p,int n printf...