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

推荐订阅源

T
Tenable Blog
H
Heimdal Security Blog
K
Kaspersky official blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Schneier on Security
G
GRAHAM CLULEY
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
CERT Recently Published Vulnerability Notes
Google DeepMind News
Google DeepMind News
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
C
Cisco Blogs
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
Security Archives - TechRepublic
Security Archives - TechRepublic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 司徒正美
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
V
Visual Studio Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
Jina AI
Jina AI
P
Proofpoint News Feed
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
L
LINUX DO - 最新话题
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
Spread Privacy
Spread Privacy
Application and Cybersecurity Blog
Application and Cybersecurity Blog
IT之家
IT之家
S
Security Affairs
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
N
News | PayPal Newsroom
Cloudbric
Cloudbric
AWS News Blog
AWS News Blog
W
WeLiveSecurity
The Last Watchdog
The Last Watchdog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
NISL@THU
NISL@THU

博客园 - jierry

ASP.NET2.0控件一览---标准控件(2) ASP.NET2.0控件一览---标准控件(1) 控件开发时两种JS嵌入资源方式的使用 - jierry - 博客园 T-SQL tips(1)临时表和表变量 Flash Control for ASP.NET 2.0-Include Flash movies in your aspx pages 为DataGrid创建自定义列控件(四) 为DataGrid创建自定义列控件(三) - jierry - 博客园 为DataGrid创建自定义列控件(二) 为DataGrid创建自定义列控件(一) (转)SQLServer和Oracle的常用函数对比 《Effective C#》读书笔记(4) 《Effective C#》读书笔记(3) 《Effective C#》读书笔记(1) 选择合适的数据控件 自带图层的链接控件(DKLinks 1.0.0.323 ) 关于CodeBuild V3.0的一些想法 小工具:SQL存储过程解密修改工具 交叉表应用-成绩统计 现在提供第一版的存储过程生成器下载,欢迎大家试用
《Effective C#》读书笔记(2)
jierry · 2005-08-07 · via 博客园 - jierry

        Item 2: Prefer readonly to const

        第2项: 定义常量时,优先使用readonly,而不是const

        在C#中存在两种定义常量的方法。第一种是编译时(compile-time)的常量,一种是运行时(Runtime)的常量。
        
        编译时常量:public const int year= 2005;(使用const关键字)
        运行时常量:public static readonly int year= 2005;(使用readonly关键字)

        让我们先来看看这两种常量的区别:

1、编译时常量的值永远不会改变;运行时常量可能具有不同的值。
        2、编译时常量只能在该字段的声明中初始化;运行时常量可以在声明或构造函数中初始化。
        3、编译时常量比运行时常量速度稍微快点,但是灵活性远远比不上运行时常量。
        4、编译时常量可以用来修饰函数内部常量和字段的常量,而运行时常量只能修饰字段常量。

        为什么要优先使用运行时常量呢?
        
        首先它能够定义更多的类型。编译时常量只能定义字符串和数值,而运行时常量的赋值在Runtime进行时,这样使它具有更多的灵活行,这样运行时常量的值就可以任何类型,但是你必须在构造器或初始化时给它赋值。同时运行时常量支持new来赋值:
        private static readonly  DateTime time= new DateTime( 2000, 1, 1, 0, 0, 0 );

        其次运行时常量可能具有不同的值,而编译时常量的值是唯一的。编译时常量是在编译时赋值的,要想改变它的值必须再次编译1次;而运行时常量是在运行时解析的,你可以在不需要再次编译的情况下改变它的值,这样就大大的增加了可维护性。可以看出编译时的常量只是值的替换,是硬代码;而运行时常量只是在

runtime才被解析,并不是一个值,是动态载入的。
    
    让我们看看以下的例子体会下运行时常量的优势:
    

    比如建立1个类:
    
public class A
    {
        
public const int a=18;
        
public static readonly int b=20;
    }

    这时你在另一个类中(另一个assembly中)引用A类的两个常量:
    Console.WriteLine( 

"Value is {0},{1}", A.a,A.b ); 

    得到的结果是:Value 

is 18,20

    当我们修改A类为以下:

public class A
    {
        
public const int a=19;
        
public static readonly int b=21;
    }

    再次调用,你肯定会认为得到的结果是:Value 

is 19,21

    实际上得到值是18,

21。因为没有编译,编译时常量a的值并没有变化。

    总之,只有当你必须要在编译时确定值的情况下,才使用const。记住,这些值是永远不变的。其他一切情况下,使用readonly 最大的提高灵活性。