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

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
WordPress大学
WordPress大学
U
Unit 42
I
InfoQ
A
About on SuperTechFans
宝玉的分享
宝玉的分享
J
Java Code Geeks
博客园 - 司徒正美
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
G
Google Developers Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
腾讯CDC
Recent Announcements
Recent Announcements

博客园 - 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 最大的提高灵活性。