CLR类型设计之类型之常量和字段
前言
孔子说:温故而知新,可以为师矣。所以对于学习过的知识要多复习,并且每一次复习都要尽可能的去扩展,而不是书本上的几句理论知识。很多人都喜欢分享自己的学习内容,记录下生活的点点滴滴,我也很喜欢这种做法,昨天用了一天的时间,翻了很多的博客,看了不少GIT上的开源代码分享。还有亦师亦友的同事给出的建议。我今后也会多多分享一些学到的东西。
先回顾一下C#最基础的内容,在过去的一年开发,随着出现了很多的错误,让我明白了基础的重要性,程序员如果不能很好的理解他所用的语言基础,那么就会有很多乱用或者为了省事而用了不符合的内容,虽然在系统很小的时候并没有多大的差距,但是如果系统变大内容变多,很多事情就会超出程序的正常行为,变得异常起来,所以在最开始就设计好字段,显得很重要。
常量
常量和字段,在c#中定义是非常简单的,const int a=100就定义了一个int类型的名为a的常量,a的值为100,在C#高级编程和CLR中都说明了一点,就是常量必须是从不变化的值,也可以把常量当作一个静态变量去看,但是常量在声明时不必也不允许加static关键字。在C#高级编程中,还指出常量必须能在编译时用于计算,因此不能用一个从变量中抽取的值来初始化常量。CLR中说由于创建一个常量就会导致创建元数据。所以常量只能定义为编辑器所认识的基元类型。C#常见基元类型:

那么刚才提到了一个概念,元数据。为什么常量创建的时候会创建一个元数据,创建一个元数据会带来什么影响?以至于CLR要重点提醒这个问题?
metadata(元数据):是一系列的特殊数据表,描述了模块中定义的内容,有部分还用来指出托管模块引用的内容。
其实元数据的最大问题,是其性能问题,C#为了支持反射,即使你不用任何反射的代码,C#/.NET为了让它支持反射,还要给你最后生成的DLL/EXE强加50%以上的metadata(这是强制的,即便你不用反射,C#/.NET也没有提供任何编译选项将这些metadata去掉)。这就是.NET Framework Redistributable本身要40M左右的原因!所以生成一个元数据所占用的空间是比较大的。这也是CLR在强调的一点。
但是常量也有其优点的地方:常量易于修改,类似于全局配置,只要修改了一处,程序中所有使用该变量的值都会被修改,更容易避免程序出错误,如果在声明常量的位置以外的某个地方声明常量,编译器会报出错误。
字段:
字段是一种数据成员,其中容纳了一个值类型的示例或者对一个引用类型的实例,C#支持实例字段和非静态字段,如果是实例字段,容纳字段数据所需的动态内存是在构造类型实例时分配的。由于字段存储在动态内存中,所以他们的值才能获取。
其实字段在实际用起来还是很简单的,见一个类,在里面声明一个字段 string Name{get;set;},就声明了一个字段sting类型的字段值。解释一下CLR中所说的字段数据所需的动态内存是在构造实例时分配的,其实这是C#编辑器生成IL汇编语言时,利用类构造器为其实例成员初始化的一个过程。
CLR类型设计之类型之常量和字段的更多相关文章
- [Clr via C#读书笔记]Cp7常量和字段
Cp7常量和字段 常量 常量在编译的时候必须确定,只能一编译器认定的基元类型.被视为静态,不需要static:直接嵌入IL中: 区别ReadOnly 只能在构造的时候初始化,内联初始化. 字段 数据成 ...
- [CLR via C#]6. 类型和成员基础
原文:[CLR via C#]6. 类型和成员基础 6.1 类型的各种成员 在一个类型中,可以定义0个或多个以下种类的成员: 1)常量 常量就是指出数据值恒定不变的符号.这些符号通常用于使代码更 ...
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
- CLR via C#深解笔记二 - 类型设计
类型基础 所有类型都从System.Object派生 CLR要求所有对象都用new 操作符来创建. Employee e = new Employee("Constructor Para ...
- CLR类型设计之泛型(一)
在讨论泛型之前,我们先讨论一下在没有泛型的世界里,如果我们想要创建一个独立于被包含类型的类和方法,我们需要定义objece类型,但是使用object就要面对装箱和拆箱的操作,装箱和拆箱会很损耗性能,我 ...
- CLR类型设计之方法与构造器
无论学习那门语言都要学习函数体,C#,JAVA,PHP,都会涉及到函数体,而C#的函数体成员并不少,方法和构造器就是函数体成员之一,函数体成员还包括但不限于:方法,属性,构造器,终结器,运算符及索引器 ...
- 重温CLR(五)类型和成员基础
类型的各种成员 类型可以定义以下种类的成员 1 常量 常量是指出数据值恒定不变的符号.这种符号使代码更易阅读和维护.常量总与类型管理,不与类型的实例管理.常量逻辑上总是静态成员. 2 字段 字段表示只 ...
- CLR:基元类型、引用类型和值类型
最新更新请访问: http://denghejun.github.io 前言 今天重新看了下关于CLR基元类型的东西,觉得还是有必要将其记录下来,毕竟这是理解CLR成功 之路上的重要一步,希望你也 ...
- 指定的架构无效。错误: CLR 类型到 EDM 类型的映射不明确
在使用WebService开发时,同时使用了EF和linq,查询数据时,使用linq(查询订单)可以正常拉出数据, 但是使用EF(查询用户)却会报以下错误: {"指定的架构无效.错误: \r ...
随机推荐
- Python中map()函数浅析
MapReduce的设计灵感来自于函数式编程,这里不打算提MapReduce,就拿python中的map()函数来学习一下. 文档中的介绍在这里: map(function, iterable, .. ...
- this到底指向哪里
this指向调用它的对象 首先要明确,this指向调用方,谁调用,this指向谁. 直接调用 举个栗子: var test = 'window' ; function testThis () { va ...
- springboot mybatis优雅的添加多数据源
springboot的原则是简化配置,本文试图不通过xml配置,使用configuration配置数据源,并进行简单的数据访问. 并且配置了多数据源,在开发过程中这种场景很容易遇到. 1.依赖 spr ...
- ASP.NET没有魔法——ASP.NET MVC是如何运行的?它的生命周期是什么?
前面的文章我们使用ASP.NET MVC创建了个博客应用,那么它是如何工作的呢?我们都知道ASP.NET的程序需要部署到IIS上才能够通过浏览器来访问,那么IIS与ASP.NET MVC程序之间又是如 ...
- 敏捷开发(2)-Scrum
什么是SCRUM Scrum的英文意思是橄榄球运动的一个专业术语,表示“争球”的动作:把一个开发流程的名字取名为Scrum,我想你一定能想象出你的开发团队在开发一个项目时,大家像打橄榄球一样迅速.富有 ...
- 关于string.h中字符串的操作
string.h中字符操作的函数 注意:**对字符数组的多次操作需要进行赋初值.或者善于用memset()函数进行清空数组的操作.** 否则容易出现错误. string.h文件中函数的用法加 ...
- 从canvas理解面向对象
前言 据说在编程语言的发展过程中,面向对象语言的出现是为了解决GUI编程的问题而出现的.计算机一开始是用纸带,命令行等来和人进行交互,而图形界面的出现是一次重大的改进,使普通人很容易就能使用计算机. ...
- 学web前端开发写给新手的建议,超实用!
01 前面的话 如今我们使用的互联网,客户端与服务器端的交互无时无刻不在发生.比如我们在浏览器打开网页,浏览器就是客户端,将网页数据发过来的也就是服务器.其实服务器,并没有什么特别的,也就是一台昼夜不 ...
- mysql 中select for update 锁表的范围备注
mysql的锁表范围测试 1.主键明确时,行级锁: 解释:指定主键并且数据存在时,仅锁定指定的行,其它行可以进行操作 实例:指定了锁定id=1的行且数据存在①,在更新1时lock wait超时②,但是 ...
- (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探
一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...