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 ...
随机推荐
- 怎样让PDM图形列表显示name和code等需要的信息
1. 工具(TOOLS)-〉显示参数设置(DISPLAY PREFERENCES) 2. 在弹出来的框中选中Content-〉Table 3. 点右下角那个Advanced 按钮 4. 在弹出的框个选 ...
- 配置eNSP和本地电脑上的网卡相连,从而直接从本地电脑连接设备
- Java常见异常处理
Exception类: 在java中用类的形式对不正常情况进行了描述和封装对象,异常就是java通过面向对象的思想将问题封装成了对象. 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据. ...
- JS鼠标滚轮事件详解
鼠标滚轮事件 //兼容性写法,该函数也是网上别人写的,不过找不到出处了,蛮好的,所有我也没有必要修改了 //判断鼠标滚轮滚动方向 if (window.addEventListener)//FF,火狐 ...
- java:利用静态字段和构造函数实现已建对象数查询
问题:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数. 请写一个类,在任何时候都可以向它查询"你已经创建了多少个对象?". 程序设计思想: 利用静态变量指定一个计数 ...
- Ubuntu远程登陆、SSH图形界面、WOL远程唤醒
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 实现目标:通过路由器配置路由路径,将拨号获取的公网IP地址指向局域网Ubuntu服务器.家里有 ...
- 利用cookies+requests包登陆微博,使用xpath抓取目标用户的用户信息、微博以及对应评论
本文目的:介绍如何抓取微博内容,利用requests包+cookies实现登陆微博,lxml包的xpath语法解析网页,抓取目标内容. 所需python包:requests.lxml 皆使用pip安装 ...
- 微信小程序左滑删除功能
效果图如下: wxml代码: <view class="container"> <view class="touch-item {{item.isTou ...
- Codeforces Round #443 (Div. 2) C. Short Program
C. Short Program time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Milking Time
Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her producti ...