惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy International News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
O
OpenAI News
Cloudbric
Cloudbric
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
L
Lohrmann on Cybersecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tenable Blog
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
P
Proofpoint News Feed
Webroot Blog
Webroot Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 三生石上(FineUI控件)
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Jina AI
Jina AI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
L
LangChain Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东

博客园 - 啊不才

【转载备用】Linux内核编译 幸运的Windows 7 Party 社区活动 jQueryinAction学习笔记——01 - 啊不才 - 博客园 django的字符替换问题 如何在屏幕中央打开一个特定的窗口 KB937061和KB947738多次安装问题 BlogEngine.Net的皮肤 [How Do I]系列学习笔记——001:学习一些技巧 继承类中override和new的区别 我提交的ACM题库的答案 『框架设计(第2版)CLR Via C#』学习笔记——使用is和as操作符来进行强制类型转换 调用Master页面上的属性 NotePad++很好用,但是我真的不想再用它了 BlogEngine的SQL Server数据库配置 关于asp:ScriptManager与Script代码块的位置关系问题 NHiBernate学习笔记(1) 使用JMail.NET时遇到的问题 ToString()方法与Convert.ToString()的差异 【已解决,看后文】使用BlogEngine.net的扩展插件Silverlight Player Extension遇到的问题
『框架设计(第2版)CLR Via C#』学习笔记——常量
啊不才 · 2008-03-05 · via 博客园 - 啊不才

常量之所以姓“常”,就是说它的值永远不会改变。定义一个常量符号时,它的值在编译时必须是确定的。编译后,常量的值就保存在程序集(assembly)的元数据中,这意味着它必须是编译器可以处理的基元数据(primitive type)。在C#中,可以用于定义常量的是:Boolen,Char,Byte,SByte,Int16,UInt16,Int32,UInt32,Int64,UInt64,Single,Double,Decimal和String。

常量总是被当作静态成员,而非实例成员。定义常量将导致元数据的产生。

using System;
public sealed class SomeLibraryType{
public const Int32 MaxEntriesInList = 50;
}

在上面的代码中要注意,c#不允许为常量指定static关键字,因为常量通常隐含着static。

当代码引用一个常量符号时,编译器将在定义常量的程序集的元数据中查找该符号,提取常量的值,并将值嵌入编译后生成的IL代码中。因为常量的值在编译时就直接嵌入代码中,所以在运行时就不需要为常量分配任何内存。

另外,我们还无法得到常量的地址,也不能通过引用传递常量。所以正是这样的约束导致常量没有很好的跨程序集版本控制特性。

让我们一起来看看为何会出现常量的版本控制问题。在程序集A中定义了一个常量i=50,编译它得到一个程序集。这时有一个程序集B引用了程序集A,并用到了A中的常量i,我们编译程序集B时,编译器读取A中i的值50,直接放到B中i出现的地方。也就是说当B编译后,B就只知道数字50,不知道它时怎么得来的,这时我们修订程序集A,把它的i修改为1000,然后我们编译程序集A得到新的程序集A,但是我们的B并不知道那个50已经改变了,所以如果B想要获取新值,也必须重新编译。

因此在运行时(不是在编译时),如果一个程序集需要另一个程序集中获取值,则不能使用常量,应当使用只读字段。