`
北极的。鱼
  • 浏览: 159082 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】 readonly, const, static readonly说明

    博客分类:
  • C#
 
阅读更多

转自:http://blog.csdn.net/shinehoo/article/details/5256781

 

文章1:

 

我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。在多数情况下可以混用。二者本质的区别在于,const的值是在编译期间确定的,因此只 能在声明时通过常量表达式指定其值。而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值 。明白了这个本质区别,我们就不难看出下面的语句中 static readonly和const能否互换了:

1. static readonly MyClass myins = new MyClass();
2. static readonly MyClass myins = null;
3. static readonly B = 10;   static readonly A = B * 20;
4. static readonly int [] constIntArray = new int[] {1, 2, 3};
5. void SomeFunction()
   {
      const int a = 10;
      ...
   }
6.private static string astr="abcd";
  private const string str = astr+"efg";
1:不可以 换成const。new操作符是需要执行构造函数的,所以无法在编译期间确定
2:可以换成const。我们也看到,Reference类型的常量 (除了String)只能是Null。
3:可以换成const。我们可以在编译期间很明确的说,A等于200。
4:不可以换成 const。道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。
5:不可以换成readonly,readonly只能用来修饰类 的field,不能修饰局部变量,也不能修饰property等其他类成员。

6.错误:如果在astr前加上const或者const改为readonly即可;

总结:1.const、readonly和static readonly定义的常量,指定初始值后(包括在构造函数内指定的初始值) 将不可更改,可读不可写;
        2.const定义时必 须指定初始值,而readonly定义时可以不进行初始化(MS建议在定义时初始值),同时也可以在构造函数内指定初始值,

          并以构造函数内指定的值为准;

        3.const和static readonly定义的常量是静态的,只能由类直接访问;而readonly定义的常量是非静态 的,只能由实例对象访问;   
        4.static readonly常量,如果在构造函数内指定初始值,则必须是静态无参构造函数;
        5.const是编译时常量,readonly是运行时常量;cosnt较高效,readonly较灵活。在应用上以static readonly代替const,以平衡const在灵活性上的不足,
           同时克服编译器优化cosnt性能,所带来的程序集引用不一致问题;  

 

转载自:http://www.nfhot.com/showtopic-44.html

 

文章2:

 

const 和 readonly 的区别,总是不太清楚,于是查了查资料。

const 的概念就是一个包含不能修改的值的变量。
常数表达式是在编译 时可被完全计算的表达式。因此不能从一个变量中提取的值来初始化常量。
如果 const int a = b+1; b 是一个变量,显然不能再编译时就计算出结果,所以常量是不可 以用变量来初始化的。



  readonly 允许把一个字段设置成 常量,但可以执行一些运算,可以确定它的初始值。
因为 readonly 是在计算时执行的,当然它可以用某些变量初始化。
readonly 是实例成员,所以不同的实例可以有不同的常量值,这使readonly更灵活。


readonly 关键字与 const 关键字不同。 

1. const 字段只能在该字段的声明中初始化。
   readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。
2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。
3. const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。
4.const 对于引用类型的常数,可能的值只能是 string 和 null 。
   readonly 可以是任何类型

需 要注意的一个问题是:

对于一个 readonly 的 Reference 类型,只是被限定不能进行赋值(写)操作而已。而对其成员的读写仍然是不受限制的。 

public static readonly Class1 my = new Class1();

my.SomeProperty = 10;
 //正常
my = new Class1(); //出错,该对象是只读的

但是,如果上例中的 Class1 不是一个 Class 而是一个 struct , 那么后面的两个语句就都会出错。

static readonly :

Java 中 static 是当载入一个类时执行一次的。

C#中是怎么执行的,我 没有查到。很奇怪几乎每本java的书都会说static的问题,C#的往往只说怎么用,但是应该是在main函数调用之前初始化,所以static readonly 也是运行时的,可以用变量付值,如:

private static readonly string path = System.Windows.Forms.Application.StartupPath + “aaa”;

 

转载自:http://blog.csdn.net/assre/archive/2006/03/18/628091.aspx 

分享到:
评论

相关推荐

    C#编程中 readonly与const的区别

    下面通过具体的示例来进一步说明`const`和`readonly`之间的区别。 ##### 示例1:使用`const` ```csharp public class Constants { public const int MaxAttempts = 3; public const string DefaultName = "User";...

    C++ 中 const和static readonly区别

    C++ 中 const 和 static readonly 区别 C++ 中 const 和 static readonly 是两种不同的关键字,它们都用于修饰变量或字段,但是它们之间存在着本质的区别。 首先,const 是一个编译时常量,它的值是在编译期间确定...

    C#基础:基于const与readonly的深入研究

    `readonly` 可以修饰类级别的字段,也可以修饰实例级别的字段,并且可以与 `static` 关键字一起使用,以声明类级别的常量。如果 `readonly` 字段没有在声明时初始化,那么必须在实例构造函数或静态构造函数中进行...

    C#程序设计-3期(KC008) KC008110100018-怎样区别const, static和readonly?.docx

    在C#编程语言中,了解并正确使用`const`、`static`和`readonly`关键字是至关重要的。这些关键字修饰的变量在程序的不同阶段被初始化,并具有不同的作用域和使用方式。下面将详细阐述这三个关键字的区别。 首先,`...

    c#.net中const和readonly的区别

    在 file1.cs 中定义的 static readonly 常量,如果需要修改其值,只需要重新编译该文件并生成新的 DLL 文件,然后运行时引用该 DLL 的程序无需重新编译,就能读取到新的值。这在开发大型系统时,尤其有助于降低维护...

    const data彻底研究

    static const int const_value = 1; static int value = 2; void getPageAttribute(LPCVOID address) { MEMORY_BASIC_INFORMATION mbi; memset(&mbi, 0, sizeof(mbi)); VirtualQueryEx( OpenProcess(PROCESS_...

    C#中const 和 readonly 修饰符的用法详解

    1. 只有C#内置类型(int,double,long等)可以声明为const;...namespace const_and_readonly { class Program { static void Main(string[] args) { Console.WriteLine(Half a year have {0} Moths, Cal

    C#中 const 和 readonly 的不同

    在C#编程语言中,`const`和`readonly`关键字都是用来定义不可变的值,但它们之间存在着一些显著的区别。下面将详细解释这两个关键字的特性和用途。 首先,`const`关键字用于声明一个常量,它是一个在编译时就确定其...

    浅谈c#中const与readonly区别

    在C#编程语言中,`const`和`readonly`都是用来定义不可变的变量,但它们之间存在着重要的差异。理解这些差异有助于编写更加高效和安全的代码。 首先,`const`关键字用于声明编译时常量。这意味着,一旦声明了一个`...

    浅谈Java中的final关键字与C#中的const, readonly关键字

    `const`常量是静态的,不需要`static`修饰,但`readonly`字段可以是静态或实例的。 #### 4. `sealed`修饰方法和类 - `sealed`修饰方法,类似于Java的`final`,防止子类重写该方法。 - `sealed`修饰类,禁止其他类...

    C#基础概念二十五问

    这里我们探讨两个基础概念:静态成员与非静态成员,以及const和static readonly的区别。 1. 静态成员与非静态成员的区别: 静态成员(包括静态变量、静态方法等)是属于类的,而不是类的实例。这意味着无论创建...

    C#中const用法详解

    然而,需要注意的是,`const`关键字与`readonly`关键字之间存在关键区别。`const`字段只能在声明时初始化,而`readonly`字段可以在声明或构造函数中初始化。这意味着`readonly`字段的值可以在运行时根据需要有所不同...

    .NET 中的 常量字段const应用介绍

    此时,`ReadOnlyInt`和`StaticInt`的值会在运行时动态确定,所以如果删除`ConstTest.dll`,程序运行会出错,因为它们需要依赖外部的库文件来找到这些字段的定义和初始值。 总结起来,常量字段在.NET中具有以下特点...

    C# 定义常量 两种实现方法

    前者用“const”来定义,后者用“readonly”来定义。 对于静态常量(Compile-time constant),它的书写方式如下: public const int MAX_VALUE = 10; 为什么称它为静态常量呢,因为如上声明可以按照如下理解(注意...

    .net面试题.net面试题.net面试题.net面试题

    根据给定的信息,我们可以整理出以下关于 .NET 面试相关的知识...- 修改 `const` 或 `static readonly` 的值只能通过重新编译来实现。 以上就是从提供的文本中整理出的关键知识点。希望对您的 .NET 面试准备有所帮助。

    C#跳槽秘笈.txt

    #### 常量(const)、静态只读(static readonly)与只读(readonly) **常量(const)** - 定义后不可更改。 - 在编译时就会被替换为具体的值。 - 只能初始化一次。 **静态只读(static readonly)** - 在类的所有实例间...

    第13章域和属性[文].pdf

    与`const`关键字相比,`readonly`的主要区别在于`const`的值在编译时确定,而`readonly`的值则在运行时初始化。`const`不能用于引用类型,因为它们的值必须是不可变的,而`readonly`可以用于引用类型,但一旦初始化...

Global site tag (gtag.js) - Google Analytics