前言

孔子说:温故而知新,可以为师矣。所以对于学习过的知识要多复习,并且每一次复习都要尽可能的去扩展,而不是书本上的几句理论知识。很多人都喜欢分享自己的学习内容,记录下生活的点点滴滴,我也很喜欢这种做法,昨天用了一天的时间,翻了很多的博客,看了不少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类型设计之类型之常量和字段的更多相关文章

  1. [Clr via C#读书笔记]Cp7常量和字段

    Cp7常量和字段 常量 常量在编译的时候必须确定,只能一编译器认定的基元类型.被视为静态,不需要static:直接嵌入IL中: 区别ReadOnly 只能在构造的时候初始化,内联初始化. 字段 数据成 ...

  2. [CLR via C#]6. 类型和成员基础

    原文:[CLR via C#]6. 类型和成员基础 6.1 类型的各种成员 在一个类型中,可以定义0个或多个以下种类的成员: 1)常量    常量就是指出数据值恒定不变的符号.这些符号通常用于使代码更 ...

  3. CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段

    编程语言的基元类型   某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1 ...

  4. CLR via C#深解笔记二 - 类型设计

    类型基础 所有类型都从System.Object派生   CLR要求所有对象都用new 操作符来创建. Employee e = new Employee("Constructor Para ...

  5. CLR类型设计之泛型(一)

    在讨论泛型之前,我们先讨论一下在没有泛型的世界里,如果我们想要创建一个独立于被包含类型的类和方法,我们需要定义objece类型,但是使用object就要面对装箱和拆箱的操作,装箱和拆箱会很损耗性能,我 ...

  6. CLR类型设计之方法与构造器

    无论学习那门语言都要学习函数体,C#,JAVA,PHP,都会涉及到函数体,而C#的函数体成员并不少,方法和构造器就是函数体成员之一,函数体成员还包括但不限于:方法,属性,构造器,终结器,运算符及索引器 ...

  7. 重温CLR(五)类型和成员基础

    类型的各种成员 类型可以定义以下种类的成员 1 常量 常量是指出数据值恒定不变的符号.这种符号使代码更易阅读和维护.常量总与类型管理,不与类型的实例管理.常量逻辑上总是静态成员. 2 字段 字段表示只 ...

  8. CLR:基元类型、引用类型和值类型

    最新更新请访问: http://denghejun.github.io   前言 今天重新看了下关于CLR基元类型的东西,觉得还是有必要将其记录下来,毕竟这是理解CLR成功 之路上的重要一步,希望你也 ...

  9. 指定的架构无效。错误: CLR 类型到 EDM 类型的映射不明确

    在使用WebService开发时,同时使用了EF和linq,查询数据时,使用linq(查询订单)可以正常拉出数据, 但是使用EF(查询用户)却会报以下错误: {"指定的架构无效.错误: \r ...

随机推荐

  1. less使用ch1--认识语法

    @charset "utf-8"; //注释------------------------------ /*我是可以被编译出来的*/ //不能被编译出来 //变量-------- ...

  2. zoj 1938 Binomial Showdown 组合数裸基础

    Binomial Showdown Time Limit: 2 Seconds      Memory Limit: 65536 KB In how many ways can you choose ...

  3. Java面向对象 继承(上)

       Java面向对象 继承 知识概要:         (1)继承的概述 (2)继承的特点 (3)super关键字 (4)函数覆盖 (5) 子类的实例化过程 (6) final关键字 (1)继承 ...

  4. open() close()

    open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法: window.open([URL], [窗口名称], [参数字符串]) 每个参数必须用引号 参数说明: URL:可选参数,在窗口中 ...

  5. UWP 唤起应用商城,邮件

    UWP做到收尾工作的时候,一般需要在应用内做一个关于页面,用于放你的邮箱链接,商店评论链接等.. 一:打开链接 打开链接有两种做法 1.用 HyperlinkButton  (超链接按钮)这个控件,给 ...

  6. commons-pool与commons-pool2连接池(Hadoop连接池)

    commons-pool和commons-pool2是用来建立对象池的框架,提供了一些将对象池化必须要实现的接口和一些默认动作.对象池化之后可以通过pool的概念去管理其生命周期,例如对象的创建,使用 ...

  7. UVa 10954,Add All

    Huffman编码简化版,优先队列搞定. 1A 调试的时候发现一个问题..木有想明白...问题代码里给出,哪位大神给解释下. #include <iostream> #include &l ...

  8. NodeJs之数据库异常处理

    数据库异常 NodeJs版本:4.4.4 数据库链接错误 使用nodejs处理异常最麻烦不过,这里我抛开nodejs提供的domain和一些第三方库专门处理的东西.操作数据库是我们常用的功能.通过回调 ...

  9. jsp <input type="checkbox" name="fileId"> 是否选中

    jsp <input type="checkbox" name="fileId"> 是否选中 var a = document.getElement ...

  10. java笔记04: String的理解与运用

    一,“==”与equals() 运行以下代码,如何解释其输出结果? public class StringPool { public static void main(String args[]) { ...