zoukankan      html  css  js  c++  java
  • 【C#】字段总结

    前沿:

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

    正文:

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

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

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

    Int32 a=new Int32;

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

    int a=0;

      再比如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=50;   
    4 }

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

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

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

     class ServiceLocator
        {
            //静态只读字段,在运行时对这个类进行初始化时,他的值被存到内存中
            public static readonly Random random = new Random();
    
            private static int numberwrites = 0;
    
            public readonly string PathName = "Unity";
    
            private FileStream fs;
    
            public ServiceLocator(string pathname)
            {
                //在构造器中可以修改只读字段
                this.PathName = pathname;
            }
    
            public string Do()
            {
                numberwrites += 1;
                return PathName;
            }
        }
    

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

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

      

      public static readonly char[] Inva = new char[] { 'a','B','C'};
    
            public void Test()
            { 
                Inva[0]='v';//我们可以改变引用的对象,也就是改变引用指向的地址
                Inva = new char[] { 'x','y','z'};//无法改变引用本身
            }
    
  • 相关阅读:
    状压DP之排列perm
    CodeForces 578F Mirror Box
    Berlekamp-Massey算法
    图解git操作
    yapi安装
    springcloud gateway
    springcloud alibaba
    反射和内置方法
    绑定方法与非绑定方法
    多态性和鸭子类型
  • 原文地址:https://www.cnblogs.com/wywnet/p/3870188.html
Copyright © 2011-2022 走看看