[CLR via C#]7. 常量和字段
7.1 常量
常量(constant)是一个特殊的值,它是一个从不变化的值。
public sealed class SomeType {
//SomeType不是基元类型,但C#允许定义
//值为null的这种类型的一个常量变量
public const SomeType Empty = null;
}
由于常量的值从不变化,所以常量总是被视为类型定义的一部分。所以,常量是静态成员,而不是实例成员。定义常量将导致创建元数据。
| CLR术语 | C#术语 | 说明 |
| Static | static | 这种字段是类型状态的一部分,而不是对象状态的一部分 |
| Instance | 默认 | 这种字段与类型的一个实例关联,而不是与类型本身关联 |
| InitOnly | readOnly | 这种字段只能由一个构造器方法中的代码写入 |
| Volatile | volatile | 看到访问这种字段的代码,编译器、CLR或硬件就不会执行一些"线程不安全"的优化措施 |
public sealed class SomeType {
// 这是一个静态readonly字段:在运行时对Random类进行初始化
// 它的值会被计算并存储到内存中
public static readonly Random s_random = new Random();
// 这是一个静态read/write字段
private static Int32 s_numberOfWrites = ;
// 这是一个实例readonly字段
public readonly String Pathname = "Untitled";
// 这是一个实例read/write字段
private System.IO.FileStream m_fs;
public SomeType(String pathname) {
// 这行修改只读字段Pathname
// 由于是在构造其中,所有可以进行修改
this.Pathname = pathname;
}
public String DoSomething() {
// 该行读写静态read/write字段
s_numberOfWrites = s_numberOfWrites + ;
// 这行读取readonly实例字段
return Pathname;
}
}
在上述代码中,许多字段都是内联初始化的。C#允许使用内联初始化语法来初始化类的常量、read/write字段和readonly字段。在后面会讲到,C#实际是在构造器中对字段进行初始化的,字段的内联初始化只是一种语法上的简化而已。另外,在C#中使用内联初始化,有一些性能问题需要考虑,这些以后会着重讲解。
internal static class ReadOnlyReferences {
public sealed class AType {
// InvalidChars总是引用同一个数组对象
public static readonly Char[] InvalidChars = new Char[] { 'A', 'B', 'C' };
}
public sealed class AnotherType {
public static void M() {
// 下面三行代码是合法的,可通过编译并运行
// 修改InvalidChars数组中的字符
AType.InvalidChars[] = 'X';
AType.InvalidChars[] = 'Y';
AType.InvalidChars[] = 'Z';
// 下一行代码是非法的,无法通过编译
// 因为不能让InvalidChars 引用别的什么东西
//AType.InvalidChars = new Char[] { 'X', 'Y', 'Z' };
}
}
}
[CLR via C#]7. 常量和字段的更多相关文章
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
- CLR类型设计之类型之常量和字段
前言 孔子说:温故而知新,可以为师矣.所以对于学习过的知识要多复习,并且每一次复习都要尽可能的去扩展,而不是书本上的几句理论知识.很多人都喜欢分享自己的学习内容,记录下生活的点点滴滴 ...
- clr via c#读书笔记五:常量和字段
1.常量是值从不变化的符号.只能定义编译器识别的基元类型的常量.如:Boolean,Char,Byte,SByte,Int16,UInt16,Int32,UInt32,Int64,Single,Dou ...
- [Clr via C#读书笔记]Cp7常量和字段
Cp7常量和字段 常量 常量在编译的时候必须确定,只能一编译器认定的基元类型.被视为静态,不需要static:直接嵌入IL中: 区别ReadOnly 只能在构造的时候初始化,内联初始化. 字段 数据成 ...
- C#常量和字段以及各种方法的语法总结
目录 一. 常量和字段.... 1 1. 常量.... 1 2.字段.... 1 二.方法.... 2 1.实例构造器和类(引用类型).... 2 2.实例构造器和结构(值类型).... 2 3.类型 ...
- C#基础之类型和成员基础以及常量、字段、属性
首先吐糟一下今天杭州的天气,真是太热了!虽然没有妹子跟我约会,但宅在方寸大的窝里,也是烦躁不已! 接上一篇<C#基础之基本类型> 类型和成员基础 在C#中,一个类型内部可以定义多种成员:常 ...
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
常量,字段,构造方法 常量 1.什么是常量 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...
- C#学习笔记——常量、字段以及事件
一 常量与字段 (一) 常量 常量总是被视为静态成员,而不是实例成员.定义常量将导致创建元数据.代码引用一个常量时,编译器会在定义常量的程序集的元数据中查找该符号,提取常量的值,并将值嵌入IL中.由于 ...
- [一]class 文件浅析 .class文件格式详解 字段方法属性常量池字段 class文件属性表 数据类型 数据结构
前言概述 本文旨在讲解class文件的整体结构信息,阅读本文后应该可以完整的了解class文件的格式以及各个部分的逻辑组成含义 class文件包含了java虚拟机指令集 和 符号表 以及若 ...
随机推荐
- UVA 11402 - Ahoy, Pirates!(段树)
UVA 11402 - Ahoy, Pirates! 题目链接 题意:总的来说意思就是给一个01串,然后有3种操作 1.把一个区间变成1 2.把一个区间变成0 3.把一个区间翻转(0变1,1变0) 思 ...
- Android下拉刷新上拉载入控件,对全部View通用!
转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38868463 前面写过一篇关于下拉刷新控件的博客下拉刷新控件终结者:Pull ...
- ramoops具体失败原因来解释驱动寄存器
正在使用linux的ramoops驱动器模块,当编译完成加载.查找驱动程序加载失败.显然,直接用内核代码,为什么会出现这种情况? 第一眼ramoops初始化代码: 180 static int __i ...
- CodeCounter代码统计
今天一天写的,困死了 开发环境:VS2012 + WIN8-x64, MFC CSDN下载链接:http://download.csdn.net/detail/npu_wy/7405577 百度云下载 ...
- 我有DIY一Android遥控-所有开源
我有DIY一Android遥控-所有开源 1.试用 记得宋宝华在「设备驱动开发具体解释」提出一个这种理论「软件和硬件互相渗透对方的领地」,这次证明还是确实是这样,使用上层APP软件加上简单的更为简单的 ...
- Code Forces 448C Painting Fence 贪婪的递归
略有上升称号,最近有很多问题,弥补啊,各类竞赛滥用,来不及做出了所有的冠军.这个话题 这是一个长期记忆的主题.这是不是太困难,基本技能更灵活的测试,每次我们来看看这个问题可以被删除,处理然后分段层,贪 ...
- flex eclipse综合spring入门
首先下载FlashBuilder_4_7_LS10_win64.exe试了几eclipse安装没有成功插头,含有myeclipse8.5.spring sts2.9.2.eclipse3.5.j2ee ...
- Centos根据系统VPS安装SendMail组件使WordPress支持E-mail
1.在putty在链接: yum install sendmail 2.启动SendMail: service sendmail start 3.检查SendMail是否在监听默认的25port: n ...
- SQL入门学习0-数据库与SQL
1.1 DBMS DatabaseManagermentSystem 数据库管理系统 DBMS种类 层次型数据库(HDB) 最古老的数据库之一,把数据通过层次结构的方式表现. 关系型数据库(RDB) ...
- Winpcap网络编程十之Winpcap实战,两台主机通过中间主机通信
注:源码等等的我不会全然公开的,此篇文章写出来为大家的网络编程或者课程设计提供一定的思路.. 好,本次我们须要完毕的任务是: 完毕两台主机通过中间主机的数据通信(网络层) 添加基于IP地址的转发功能 ...