(一)实践代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace ConstReadOnlyDemo
{
//常量(const表示):在应用程序的生存周期内保持不变的字段
//常量的三个规则
//(1)常量成员的值是在编译时设置的
//(2)常量成员的值必须被写为文字的形式
//(3)要想字段的值为常量,只需要被指定的成员前,指定const关键字
//(4)默认情况下const成员是静态的。

//只读(readonly):如果在运行前不知道字段的值,而且一旦字段的值被初始化后不应在修改
//(1)可以在一个地方设置字段的值(在构造器中设置)
//(2)设置后,类本身和客户都不能修改此字段。

//类型初始化器:在包含类型的类中定义的方法,他们使类型可以对本身进行初始化
//规则是:
//(1)静态的
//(2)无参数的
//(3)没返回值的
//(4)具有rtspecialname和specialname属性
//(5)被命名为.cctor
class MagicNumbers
{
public const double pi = 3.1415;
public const int answerToAllLifeQuestion = 42;
}

//场景解释:
//假设应用程序需要跟踪当前工作站的IP地址(你不希望用const解决这个问题,因为这需要对IP地址进行硬编码)
//而且如果工作站是以动态方式获得IP地址的,那么const技术起不到作用了。此时需要用readonly了

//实例处理方法
class Workstation2
{
public Workstation2()
{
string hostName = Dns.GetHostName();
IPAddress ipAddress
= Dns.Resolve(hostName).AddressList[0];
IPAddressString
= ipAddress.ToString();
}
public const string HostName = "consette";
public readonly string IPAddressString;
}

//静态处理方法
class Workstation
{
//去掉public:静态构造器中不用需出现访问修饰符(静态构造器总是公共的)
//静态构造器:用于对静态字段、只读字段,或其他东西初始化
static Workstation()
{

IPAddress ipAddress
= Dns.Resolve(HostName).AddressList[0];
IPAddressString
= ipAddress.ToString();
}
public const string HostName = "WIN-RMEKHP84MBJ";
public static readonly string IPAddressString;
}


class Program
{
static void Main(string[] args)
{
Console.WriteLine(
"常量 PI={0}" , MagicNumbers.pi);
Workstation2 workstation
= new Workstation2();
Console.WriteLine(
"主机 {0} 的IP地址是 {1}", Workstation.HostName, workstation.IPAddressString);
Console.WriteLine(
"主机 {0} 的IP地址是 {1}", Workstation.HostName, Workstation.IPAddressString);
Console.ReadKey();
}
}
}

(二)运行截图:

 常量(const)与只读(readonly)字段_初始化

(三)解释说明:

(1)用ILDASM(IL反汇编程序)查看运行后的.exe文件

常量(const)与只读(readonly)字段_构造器_02

(2)为什么说const成员默认是静态的,看下图反汇编程序就知道了

常量(const)与只读(readonly)字段_ipad_03

(3)readonly用IL反汇编查看器

常量(const)与只读(readonly)字段_字段_04

(4)类型初始化器

常量(const)与只读(readonly)字段_初始化_05