constants and fields in c#

来源:互联网 发布:mac wine 玩LOL 编辑:程序博客网 时间:2024/05/01 17:22

今天回顾了C#的常量和字段,又学习了不少,写点东西跟大家分享,也有利于自己记忆。
首先,我们说说C#的常量,顾名思义,常量存储的就是不可更改的值,那么常量在type中又是怎样被定义的呢?首先可以被定义为常量的类型只能是简单类型:Boolean、 Char、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、 Decimal、 String,当然有一种特殊情况,可以对非简单类型的变量为声明为constant,只有在那个变量的值为null的时候。以下为代码示例:

using System;

public sealed class SomeType
{
public const int SomeNumber = 32;
public const SomeType = null;
}

常量是被当做类型变量的,就像static变量一样,常量会包含在元数据中,常量的值直接嵌入到元数据中。在编译的时候,complier根据常量符号直接到元数据中找到那个值,然后直接嵌入到IL代码中,所以不需要动态分配内存。所以假如把上面那一段编译为dll文件的话(也即是一个 assembly),现在有这么一段代码:

using System;

public class Program
{
Console.WriteLine("The const number is {0} ",SomeType.SomeNumber);
}

编译这段代码,然后执行,毫无疑问结果就是32,如果现在把SomeNumber改为50,重新把它编译为dll文件,如果不重新编译上一段代码,执行结果不会改变,要想结果变为50,就必

须重新编译一遍,执行,结果就变为50,在这种情况下,dll文件甚至都不会被加载。

讲完常量,让我们接着说说字段是什么。

字段是一个类型的变量,它可以是一个值类型变量,也可以是一个引用类型变量,字段一般会有四种修饰符:static 、default、readonly、volatile。

在这里就简单讲述一下static 和readonly的用法:

static的意思就是说这个字段是属于类型的,表示类的状态,而default是表示类型实例的状态。

readonly表示这个字段是只读的,不能写,只能在构造函数中初始化。(反射能够用来修改readonly字段,反射是个啥玩意?只听说过,目前还没接触到)

字段是需要动态分配内存的,所以字段的值都是在运行时才能获得的。

采用常量那段类似的一个代码示例:

using System;

public sealed class SomeType
{
public static readonly SomeNumber = 32;
}

假如现在依旧有一个程序引用它编译之后的DLL,如下:

using System;

public class Program
{
Console.WriteLine("The const number is {0} ",SomeType.SomeNumber);
}

编译这段代码,结果依旧是32,如果把SomeNumber改为50,重新编译为dll,那么无需重新编译这段代码,直接执行结果变为50。

最后说一点,readonly声明的引用字段,引用变量是不可改变的,即不能指向别的对象,它指向的那个对象本身是可以改变的。

原创粉丝点击