前沿:

  字段(field)是一种数据成员,其中容纳了一个值类型的实例或者一个引用类型的引用。

正文:

  CLR支持类型(静态)字段和实例(非静态)字段。对于类型字段,用于容纳字段数据的动态内存是在类型对象中分配的,而类型对象是在类型记载到一个AppDomain时创建的。那么,什么时候要将类型加载到一个AppDomain中呢?这通常是在引用了该类型的任何方法首次进行JIT编译的时候。对于实例字段,用于容纳字段数据的内存则是在构造类型的一个实例时分配的。

  由于字段存储在动态内存中,所以他们的值在运行时才能获取。字段还解决了常量存在的版本控制问题。此外,字段可以是任何数据类型,不必像常量那样仅仅局限于编译器内置的基元类型。那什么是基元类型呢(int 、unit等等)?

  基元类型:编译器直接支持的数据类型。如果没有基元类型,我们在声明一个整数的时候应该是这样子的

  1. Int32 a=new Int32;

  幸运的是有了基元类型,我们可以直接用下面的方法,也就是我们在编程的时候经常用到的:

  1. int a=;

  再比如string和String,刚开始我对这两个类型很困惑,到底什么时候用哪一个呢,但是看了基元类型的讲解,你就会明白,由于C#的string直接映射到String(FCL类型),所以两者没有区别,都可以使用。

  CLR支持readonly字段和read、write字段。大多数字段都是read和write字段,这意味着在代码执行过程中,字段值可以多次改变。但是readonly字段只能在一个构造器方法中写入。(这个构造器方法只能调用一次,也就是对象首次被创建时),编译器和验证机制确保readonly字段不会被构造器以外的方法写入。但是可以利用反射来修改。

  现在我们使用一个静态readonly字段来修正版本控制问题:

  1. public sealed class someType
  2. {
  3. public static readonly int MaxList=;
  4. }

  这是唯一需要修改的,应用程序的代码不必修改。但是们为了观察新的行为,必须重新生成他,当应用程序的Main方法运行时,CLR将加载到DLL程序集,并从分配给他的动态内存中提取MaxList字段的值50.

  假设DLL程序集的开发人员将50改为100,并重新生成程序集。当应用程序代码重新执行时,他将自动提取字段的新值100,在这种情况下,程序不需要重新生成,他可以直接运行。要注意的是,当前假定的是DLL程序集的新版本没有进行强命名。

  下面这个演示了如何定义一个与类型本身关联的readonly静态字段和读写字段。另外还定义了read/write静态字段。

  1. class ServiceLocator
  2. {
  3. //静态只读字段,在运行时对这个类进行初始化时,他的值被存到内存中
  4. public static readonly Random random = new Random();
  5.  
  6. private static int numberwrites = 0;
  7.  
  8. public readonly string PathName = "Unity";
  9.  
  10. private FileStream fs;
  11.  
  12. public ServiceLocator(string pathname)
  13. {
  14. //在构造器中可以修改只读字段
  15. this.PathName = pathname;
  16. }
  17.  
  18. public string Do()
  19. {
  20. numberwrites += 1;
  21. return PathName;
  22. }
  23. }

  在上述代码中,许多字段都是内联初始化的(就是直接在代码中直接赋值来初始化,而不是通过构造函数),C#允许使用这种方法来初始化类的常量、读写字段、只读字段。C#实际上是在构造函数中对字段进行初始化的,字段的内联初始化只是一种语法上的简化。

  注意,当某个字段是引用类型,并且该字段被声明为只读时,那么不可改变的是引用本身,而不是引用的对象(也就是分配在堆中的值)。

  

  1. public static readonly char[] Inva = new char[] { 'a','B','C'};
  2.  
  3. public void Test()
  4. {
  5. Inva[0]='v';//我们可以改变引用的对象,也就是改变引用指向的地址
  6. Inva = new char[] { 'x','y','z'};//无法改变引用本身
  7. }

【C#】字段总结的更多相关文章

  1. UniEAP V4 WorkShop用户手册

    版权声明<UniEAP V4 WorkShop用户手册>的版权归东软集团(大连)有限公司所有.未经东软集团(大连)有限公司的书面准许,不得将本手册的任何部分以任何形式.采用任何手段(电子的 ...

  2. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  3. MySQL设置字段的默认值为当前系统时间

    问题产生: 当我们在对某个字段进行设置时间默认值,该默认值必须是的当前记录的插入时间,那么就将当前系统时间作为该记录创建的时间. 应用场景: 1.在数据表中,要记录每条数据是什么时候创建的,应该由数据 ...

  4. Django admin定制化,User字段扩展[原创]

    前言 参考上篇博文,我们利用了OneToOneField的方式使用了django自带的user,http://www.cnblogs.com/caseast/p/5909248.html , 但这么用 ...

  5. 使用Expression实现数据的任意字段过滤(1)

    在项目常常要和数据表格打交道. 现在BS的通常做法都是前端用一个js的Grid控件, 然后通过ajax的方式从后台加载数据, 然后将数据和Grid绑定. 数据往往不是一页可以显示完的, 所以要加分页: ...

  6. 说说BPM数据表和日志表中几个状态字段的详细解释

    有个客户说需要根据这些字段的值作为判断条件做一些定制化需求,所以需要知道这些字段的名词解释,以及里面存储的值具体代表什么意思 我只好为你们整理奉上这些了! Open Work Sheet  0 Sav ...

  7. [DS] 标记字段

    标记字段 代码中有时候有这种需求:需要一个公共访问的标记字段,以下称为标记字段. 下面是案例: 一个订单详情页面,如果页面在显示中,程序中其它地方需要访问这个"正在查看中"的订单信 ...

  8. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  9. [源码]Literacy 快速反射读写对象属性,字段

    Literacy 说明 Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多 当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但 ...

  10. mysql向表中某字段后追加一段字符串:

    mysql向表中某字段后追加一段字符串:update table_name set field=CONCAT(field,'',str) mysql 向表中某字段前加字符串update table_n ...

随机推荐

  1. C++ ------ 互斥锁、原子操作的性能测试

    atomic原子操作:是在新标准C++11,引入了原子操作的概念,并通过这个新的头文件提供了多种原子操作数据类型,例如,atomic_bool,atomic_int等等 测试程序 #include & ...

  2. centos7下配置mysql5.7.24主从复制

    前置条件 准备两台服务器(可以是虚拟机),系统为centos7 此处演示的两台服务器:192.168.8.134.192.168.8.135 第一步:安装mysql5.7.24 先在两台服务器上安装m ...

  3. 图:centrality

    [定义]Centrality:图中每个节点v的相对重要度c(v),重要度是什么可根据具体应用定义. [估计方法] Degree centrality Betweenness centrality Cl ...

  4. BZOJ2588:LCA+主席树来实现树上两点之间第K大点权查询

    对于每个节点维护这个节点到根的权值线段树 对于每个询问(x,y),这条路径上的线段树 tree[x]+tree[y]-tree[lca(x,y)]-tree[fa[lca(x,y)]] #includ ...

  5. WIN7 系统 右键计算机 点击管理 出现对话框:找不到文件。

    解决方法: WIN+R组合键运行 “regedit” HKEY_LOCAL_MACHINE----SOFTWARE----Classes----CLSID----{20D04FE0-3AEA-1069 ...

  6. JVM调优总结(6):新一代的垃圾回收算法

    垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...

  7. angular 开发之proxy

    创建proxy配置文件proxy.conf.json 内容如下  {   "/api/*": { "target": "https://abc.com ...

  8. 【BZOJ】4872: [Shoi2017]分手是祝愿 期望DP

    [题意]给定n盏灯的01状态,操作第 i 盏灯会将所有编号为 i 的约数的灯取反.每次随机操作一盏灯直至当前状态能够在k步内全灭为止(然后直接灭),求期望步数.n,k<=10^5. [算法]期望 ...

  9. jquery.cookie.js——jquery的cookie插件

    一.JS文件 /*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 2 ...

  10. How to insert a segment of noise to music file

    如何向音频文件中插入噪声 为了研究噪声和音乐对EEG的的影响,实验前需要准备一段夹杂噪声的音乐. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...