C#靜態常量和動態常量的區別

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,必須在
????????????????聲明同時賦值
?
何時發揮作用??編譯時進行替換??????相當于類中的數據成員

轉載于:https://www.cnblogs.com/zhangchengye/p/5155578.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373733.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373733.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373733.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring的鉤子_高級java開發必須掌握的Spring接口——SmartLifecycle

有些場景我們需要在Spring 所有的bean 完成初始化后緊接著執行一些任務或者啟動需要的異步服務。 常見有幾種解決方案j2ee 注解 啟動前PostConstruct 銷毀前PreDestroy 基于j2ee 規范springboot 的 org.springframework.boot.CommandLineRunner springboot 特性前面我已經介紹過…

Java:對Java SE 6和Java SE 7的客戶端和桌面部分的改進!

Java 6和Java 7中的客戶端改進 了解有關Java SE 6和Java SE 7的客戶端和桌面部分的改進,包括新的applet插件,Java Deployment Toolkit,成形和半透明的窗口,重量級-輕量級混合以及Java Web Start。 介紹 自2006年12月發布Java平臺…

辨異 —— 行星 vs 恒星

star:恒星,planet:行星;1. 恒星 恒星是指宇宙中靠核聚變產生的能量而自身能發熱發光的星體(比如太陽)。過去天文學家以為恒星的位置是永恒不變的,以此為名。但事實上,恒星也會按照一…

軟件公司職責分配

崗位:項目經理 主要職責:1、 計劃:a)項目范圍、項目質量、項目時間、項目成本的確認。b)項目過程/活動的標準化、規范化。c)根據項目范圍、質量、時間與成本的綜合因素的考慮,進行項目的總體規劃與階段計劃。d)各項計劃得到上級領…

大型網站架構系列:負載均衡詳解(4)

本文是負載均衡詳解的第四篇,主要介紹了LVS的三種請求轉發模式和八種負載均衡算法,以及Haproxy的特點和負載均衡算法。具體參考文章,詳見最后的鏈接。 三、LVS負載均衡 LVS是一個開源的軟件,由畢業于國防科技大學的章文嵩博士于19…

關于JavaFX的最常見問題

上周,我在斯德哥爾摩的Jfokus 2012上做了一個關于JavaFX的演講,當時我意識到每次活動都會問三個問題。 似乎有一個普遍的興趣,所以我嘗試在這篇文章中回答他們(盡可能的說實話): iPad或其他移動設備上的Jav…

python中面向對象空間時間_python基礎學習Day15 面向對象、類名稱空間、對象名稱空間 (2)...

一、類先看一段代碼:classPerson:animal 高級動物walk_way 直立行走 # 靜態屬性,靜態變量,靜態字段language 語言def __init__(self,name,age,work): # 函數 動態屬性,方法#print(self)self.name nameself.ageageself.workworkdef…

Linux GRUB 引導Win 7 ---- error: invalid EFI file path

最近新買了個固態硬盤,先裝了個Win 7系統,現在裝的系統和以前裝系統唯一的區別是引導不是以前的MBR,而是最新看似是個趨勢的GPTUEFI方式。 win 7 裝完啦,還是和以往的一樣裝 Ubantu (Ubantu 12.04),ubantu 引導磁盤扇…

其他位不變,具體位的賦值操作

GPIOC (GPIOC & 0xf0) | (Content[s_Index] & 0x0f);        //低四位賦值GPIOB (GPIOB & 0xc3) | ((Content[s_Index]>>2) & 0x3c);     //中間四位賦值 具體某一位置1或取反&#xff1a; 正確寫法&#xff1a; 置1:GPIOC | (1<<i…

使用Spring AOP實現活動記錄模式

在班級設計中&#xff0c;我們應就每個班級的職責分配做出決定。 如果我們選擇的不錯&#xff0c;系統將更易于理解&#xff0c;維護和擴展。 幾乎我們所有的項目都有一個持久層&#xff0c;即關系數據庫&#xff0c;文檔存儲或僅XML文件。 通常&#xff0c;您將使用DAO模式在業…

Java基礎之反射

框架都要用到反射技術&#xff0c;反射都要用到一個類Class. java程序中的各個java類屬于同一類事物&#xff0c;描述這類事物的java類名就是Class. 得到字節碼的方式有三種&#xff1a; Date.class;new Date().getClass();Class.forName("java.lang.String");最后一…

php socketconnect連接失敗_PHP設計模式之模板方法模式

模板方法模式&#xff0c;也是我們經常會在不經意間有會用到的模式之一。這個模式是對繼承的最好詮釋。當子類中有重復的動作時&#xff0c;將他們提取出來&#xff0c;放在父類中進行統一的處理&#xff0c;這就是模板方法模式的最簡單通俗的解釋。就像我們平時做項目&#xf…

linux系統硬件配置查看方法

一&#xff1a;查看cpu more /proc/cpuinfo | grep "model name" grep "model name" /proc/cpuinfo 如果覺得需要看的更加舒服 grep "model name" /proc/cpuinfo | cut -f2 -d: 二&#xff1a;查看內存 grep MemTotal /proc/meminfo grep MemT…

java String源碼學習

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/**char數組用于字符的存儲 */private final char value[];/** 緩存string的hash碼 */private int hash; // Default to 0public String() {/**無參構造函數,打印值為&quo…

JBoss AS 7.1.0.Final“ Thunder”發布-Java EE 6 Full Profile認證!

在JBoss AS7上進行了大約一年的開發后&#xff0c;我們現已發布7.1.0.Final“ Thunder” &#xff01; 可從此處的通常位置下載該文件。 對于JBoss AS7團隊來說&#xff0c;這是一個非常大的成就&#xff0c;我們為此版本感到非常自豪。 這個版本包含了7.1.0.CR1b的許多錯誤修復…

數據庫建表練習(10.11作業)

轉載于:https://www.cnblogs.com/HRZJ/p/5951897.html

天干地支計算公式_天干地支主怎樣計算?

回答&#xff1a;少女時代級別&#xff1a;碩士研究生2009-01-08 20:34:04來自&#xff1a;貴州省貴陽市我國古代是用天干地支來紀年的&#xff0c;現代社會已很少使用。一來現今社會已經離不開國際化&#xff0c;沿用老的歷法已經不現實&#xff1b;二來天干地支在民間多用于算…

從程序員到CTO的Java技術路線圖

時間:2013-05-29 17:39來源:www.chengxuyuans.com在技術方面無論我們怎么學習&#xff0c;總感覺需要提升自已不知道自己處于什么水平了。但如果有清晰的指示圖供參考還是非常不錯的&#xff0c;這樣我們清楚的知道我們大概處于那個階段和水平。 Java程序員 高級特性 反射、泛型…

Linux的網卡相關

檢測linux下網卡是否正常 1.dmesg | grep eth 如果出現以下 eth0: link up 說明是網卡正常的 eth0: registered as PCnet/PCI II 79C970Aeth0: link upeth0: no IPv6 routers present 2.如果所用網卡是pcI總線的 。用命令&#xff1a;lspci 能看到網卡是存在的。 3.用ethtool…

設置Spring 3開發環境

本教程簡要說明了如何設置典型的環境來開發基于Spring的應用程序。 除了可以正常工作的Windows XP客戶端具有足夠的CPU能力和內存外&#xff0c;本教程沒有其他先決條件。 在教程中&#xff0c;我們將需要安裝以下組件&#xff1a; Java 6 JDK更新26 用于Java EE開發人員的Ecl…