【C#进阶系列】07 常量和字段
常量
常量总是被视为静态成员。
常量其实可以不限于基元类型,但是必须初始化为null。(我觉得这个点知道和不知道都一样,我已经自动从脑海中忽略了。很多时候在我这个人眼中,艰涩的代码和垃圾代码,其实没有任何区别。很讨厌明明有更简单易懂的解决方案,非要去炫一些生僻无用的技术的程序员,总是喜欢用这种方式让哥哥我不能按时下班)
而且编译的时候会直接提取常量的值嵌入IL代码中,所以运行时也不需要分配空间。
字段
之前的章节讲过了CLR支持静态字段和实例字段。
静态字段是放在类型对象中的,类型对象在类型加载到一个AppDomain时创建(通常就是引用了该类型的任何方法首次进行JIT编译时),
而实例字段是放在实例对象中的。
字段的修饰符除了默认的实例字段和static静态字段,还有readonly表示只读字段。
只读字段众所周知,只能由一个构造器方法将值写入,或内联初始化(就是在代码中声明的时候直接赋值,而不是用构造器)。
实际上内联初始化还是用了一个构造器来进行字段初始化,内联初始化只是一种语法上的简化。(实际上内联初始化还有一些性能问题也要考虑,下一章再写)
当然其实还是有别的玩法的,比如用反射就可惜修改readonly字段。
还有一个修饰符用的就不多,volatile(文档译为可变,作者表示为易变,因为这种字段一般多个线程都可能想对它进行修改),说实话,在本人看着本书之前,根本不知道有这么一个修饰符。⊙﹏⊙‖∣
当一个字段用volatile修饰后,那么编译器、CLR和硬件都不会对访问这种字段的代码执行“线程不安全”的优化措施。(这个东西在本书后面线程同步中有讲到,我还没看到,以后再写吧)
【C#进阶系列】07 常量和字段的更多相关文章
- JavaScript进阶系列07,鼠标事件
鼠标事件有Keydown, Keyup, Keypress,但Keypress与Keydown和Keyup不同,如果按ctrl, shift, caps lock......等修饰键,不会触发Keyp ...
- C#进阶系列 ---- 《CLR via C#》
[C#进阶系列]30 学习总结 [C#进阶系列]29 混合线程同步构造 [C#进阶系列]28 基元线程同步构造 [C#进阶系列]27 I/O限制的异步操作 [C#进阶系列]26 计算限制的异步操作 ...
- JavaScript进阶系列06,事件委托
在"JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数"中已经有了一个跨浏览器的事件处理机制.现在需要使用这个 ...
- JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数
本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 ■ 跨浏览器事件处理 □ 事件必须在页面元素加 ...
- JavaScript进阶系列04,函数参数个数不确定情况下的解决方案
本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...
- JavaScript进阶系列03,通过硬编码、工厂模式、构造函数创建JavaScript对象
本篇体验通过硬编码.工厂模式.构造函数来创建JavaScript对象. □ 通过硬编码创建JavaScript对象 当需要创建一个JavaScript对象时,我们可能这样写: var person = ...
- JavaScript进阶系列02,函数作为参数以及在数组中的应用
有时候,把函数作为参数可以让代码更简洁. var calculator = { calculate: function(x, y, fn) { return fn(x, y); } }; var su ...
- JavaScript进阶系列01,函数的声明,函数参数,函数闭包
本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...
- MS SQL巡检系列——检查外键字段是否缺少索引
前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...
随机推荐
- whoami 和 Who am i
① 两个命令在一般的情况下,似乎效果是一样的 ② 但是当你执行完su 命令切换用户后,就不一样了,who am i 显示最早login的账户,而whoami 显示切换后的账户 例如: -bash-3. ...
- LeetCode: Path Sum II 解题报告
Path Sum II Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals ...
- 在 Excel 中使用正则表达式进行查找与替换
在 Excel 中,使用 Alt+F11 快捷键打开 VBA 项目窗口,在左侧的工作表名称上点右键,选择查看代码,即可出出现右侧的代码编辑窗口 在代码窗口中输入以下代码: Private Sub Re ...
- HTML5图片旋转
HTML5图片旋转 首先我们使用Cococs2dx-Js-Lite版,来创建一个工程,我们所需要的开发环境如下: 1,webstrom 2,google chrome浏览器 3,cocos2dx-Js ...
- Node.js之绝对选择
几年前,完全放弃Asp.net,彻底脱离微软方向.Web开发,在公司团队中,一概使用Node.js.Mongodb.Git,替换Asp.net mvc.Sql server和Tfs.当时来看,这是高风 ...
- Spring3 MVC请求参数获取的几种方法
Spring3 MVC请求参数获取的几种方法 一. 通过@PathVariabl获取路径中的参数 @RequestMapping(value="user/{id}/{name}&q ...
- 关于float /double、string类型的hash函数/hash表实现(转)
#include <ext/hash_map> #include <math.h> #include <stdio.h> using namespace std; ...
- ux.form.field.Verify 验证码控件
//验证码控件 Ext.define('ux.form.field.Verify', { extend: 'Ext.container.Container', alias: ['widget.fiel ...
- [Android Studio 权威教程]断点调试和高级调试
好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for ( ...
- 【迁移学习】2010-A Survey on Transfer Learning
资源:http://www.cse.ust.hk/TL/ 简介: 一个例子: 关于照片的情感分析. 源:比如你之前已经搜集了大量N种类型物品的图片进行了大量的人工标记(label),耗费了巨大的人力物 ...