程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中的readonly與const,

C#中的readonly與const,

編輯:C#入門知識

C#中的readonly與const,


比較C#中的readonly與const 

C#中有兩種常量類型,分別為readonly(運行時常量)[read-run]與const(編譯時常量)[const-compile],本文將就這兩種類型的不同特性進行比較並說明各自的適用場景。

工作原理 
    readonly為運行時常量,程序運行時進行賦值,賦值完成後便無法更改,因此也有人稱其為只讀變量。
    const為編譯時常量,程序編譯時將對常量值進行解析,並將所有常量引用替換為相應值。
    下面聲明兩個常量:

 public static readonly int A = 2 ; // A為運行時常量 
 public const int B = 3 ; // B為編譯時常量

     下面的表達式:

 int C = A + B;

    經過編譯後與下面的形式等價:

 int C = A + 3 ;

    可以看到,其中的const常量B被替換成字面量3,而readonly常量A則保持引用方式。

聲明及初始化 
    readonly常量只能聲明為類字段,支持實例類型或靜態類型,可以在聲明的同時初始化或者在構造函數中進行初始化,初始化完成後便無法更改。
    const常量除了可以聲明為類字段之外,還可以聲明為方法中的局部常量,默認為靜態類型(無需用static修飾,否則將導致編譯錯誤),但必須在聲明的同時完成初始化。 

數據類型支持
 
    由於const常量在編譯時將被替換為字面量,使得其取值類型受到了一定限制。const常量只能被賦予數字(整數、浮點數)、字符串以及枚舉類型。下面的代碼無法通過編譯:

 public const DateTime D = DateTime.MinValue;

    改成readonly就可以正常編譯:

 public readonly DateTime D = DateTime.MinValue;


可維護性
 
    readonly以引用方式進行工作,某個常量更新後,所有引用該常量的地方均能得到更新後的值。
    const的情況要稍稍復雜些,特別是跨程序集調用:

 public class Class1
 {
      public static readonly int A = 2 ; // A為運行時常量 
      public const int B = 3 ; // B為編譯時常量 
 } 
 
 public class Class2
 {
      public static int C = Class1.A + Class1.B; // 變量C的值為A、B之和 
 } 
 
 Console.WriteLine(Class2.C); // 輸出"5"

    假設Class1與Class2位於兩個不同的程序集,現在更改Class1中的常量值:

 public class Class1
 {
      public static readonly int A = 4 ; // A為運行時常量 
      public const int B = 5 ; // B為編譯時常量 
 }

    編譯Class1並部署(注意:這時並沒有重新編譯Class2),再次查看變量C的值:

 Console.WriteLine(Class2.C); // 輸出"7"

    結果可能有點出乎意料,讓我們來仔細觀察變量C的賦值表達式:

 public static int C = Class1.A + Class1.B;

    編譯後與下面的形式等價:

 public static int C = Class1.A + 3 ;

    因此不管常量B的值如何變,對最終結果都不會產生影響。雖說重新編譯Class2即可解決這個問題,但至少讓我們看到了const可能帶來的維護問題。

性能比較 
    const直接以字面量形式參與運算,性能要略高於readonly,但對於一般應用而言,這種性能上的差別可以說是微乎其微。

適用場景
    在下面兩種情況下:
    a.取值永久不變(比如圓周率、一天包含的小時數、地球的半徑等)
    b.對程序性能要求非常苛刻
    可以使用const常量,除此之外的其他情況都應該優先采用readonly常量。


C語言裡面,這個符號(->)是什,怎使用?

這是結構體指針中的一個符號,給你寫個程序解釋一下吧,例如:
#include<stdio.h>
struct STU //定義一個結構體
{
int num;
}stu;
int main()
{
struct STU *p; //定義一個結構體指針
p=stu; //p指向stu這個結構體變量
stu.num=100; //給結構體成員num附個初值
printf("%d",p->num); //輸出stu中的num的值
return;
}
看到了吧,->的作法就是在引用結構體中的變量!!
形式如:p->結構體成員(如p->num)
他的作用相當於stu.num或(*p).num
不知道這樣解釋你明不明白、、、、、不懂了call我,O(∩_∩)O~
望采納。
 

C語言裡面,這個符號(->)是什,怎使用?

這是結構體指針中的一個符號,給你寫個程序解釋一下吧,例如:
#include<stdio.h>
struct STU //定義一個結構體
{
int num;
}stu;
int main()
{
struct STU *p; //定義一個結構體指針
p=stu; //p指向stu這個結構體變量
stu.num=100; //給結構體成員num附個初值
printf("%d",p->num); //輸出stu中的num的值
return;
}
看到了吧,->的作法就是在引用結構體中的變量!!
形式如:p->結構體成員(如p->num)
他的作用相當於stu.num或(*p).num
不知道這樣解釋你明不明白、、、、、不懂了call我,O(∩_∩)O~
望采納。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved