前言

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

    1.效果 1.1 样式设置 2 效果  2.1 样式

  2. WPF DataGrid 样式设置

    隔行换色,鼠标单击,悬浮样式都有,其具体效果如图 1 所示. 图 1 WPF DataGrid 样式设置效果图 其中: 界面设计代码下所示 ? + 查看代码 1 2 3 4 5 6 7 8 9 10 ...

  3. KMP算法实践与简单分析

    一.理解next数组 1.约定next[0]=-1,同时可以假想在sub串的最前面有一个通配符"*",能够任意匹配.对应实际的代码t<0时的处理情况. 2.next[j]可以 ...

  4. Ubuntu16.04下Office替代品Office Online

    Ubuntu16.04下Office替代品 Ubuntu16.04下的office Libreoffice 这个是Ubuntu自带的Office,总是存在各种问题,如果用来阅读还是不错的,但是编辑就不 ...

  5. AspxGridView控件的使用

    在网上找到的不错的资料: http://www.lmwlove.com/ai/SubjectID6 以下是自我总结: 要实现的功能:使用AspxGridView显示Scott数据库中emp与dept两 ...

  6. spring容器启动原理分析1

    在项目的web.xml中配置 <listener> <listener-class>org.springframework.web.context.ContextLoaderL ...

  7. Akka(30): Http:High-Level-Api,Routing DSL

    在上篇我们介绍了Akka-http Low-Level-Api.实际上这个Api提供了Server对进来的Http-requests进行处理及反应的自定义Flow或者转换函数的接入界面.我们看看下面官 ...

  8. LINUX 笔记-watch命令

    命令格式:watch[参数][命令] 可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令 命令参数: -n或--interval  watch缺省每2秒运行一下程序,可以用-n ...

  9. Mysql编写sql语句的小技巧

    1.查询数据(保证查询性能) SELECT * 和 SELECT t.id , t.name:后者性能其实总体优于前者. 2.在查询的时候最好给表起个 别名,方便找到表中要查询的字段.执行sql的进行 ...

  10. 主要讲下hack的兼容用法,比较浅,哈哈

    hack是主要来处理IE的兼容,不同的IE,不同的兼容方式 /*   属性前缀法(即类内部Hack):       *color:#000; *号对IE6,IE7都生效   +color:#555; ...