(一)实践代码:
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();
}
}
}
(二)运行截图:
(三)解释说明:
(1)用ILDASM(IL反汇编程序)查看运行后的.exe文件
(2)为什么说const成员默认是静态的,看下图反汇编程序就知道了
(3)readonly用IL反汇编查看器
(4)类型初始化器