知识大全 关于C# readonly关键字的分析

Posted 类型

篇首语:历史和哲学负有多种永恒的责任,同时也是简单的责任。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 关于C# readonly关键字的分析相关的知识,希望对你有一定的参考价值。

关于C# readonly关键字的分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  为了便于说明 我重新写了一个类似的代码

   class Program

  

        static void Main(string[] args)

       

            Fuck f = new Fuck( );

            f Change( out f);

            Console Read();

       

  

   struct Fuck

  

        public  readonly int Num;

  

        public Fuck(int value)

       

            Num = value;

       

  

        public void Change(int value out Fuck data)

       

            System Console WriteLine(this Num);

            data = new Fuck(value);

            System Console WriteLine(this Num);

       

  

  运行结果自然是

  

  

  这是为何呢?我把Fuck的定义改成了class 即

   Fuck

  

        public  readonly int Num;

  

        public Fuck(int value)

       

            Num = value;

       

  

        public void Change(int value out Fuck data)

       

            System Console WriteLine(this Num);

            data = new Fuck(value);

            System Console WriteLine(this Num);

       

  

  运行结果是

  

  

  问题肯定在于值类型与引用类型处理机制上 尽管在C#中 所有的类型都以object的形式存在 但在内部 值类型与引用类型的处理机制仍然不同

  让我们回到 readonly 的问题上来

  readonly 关键字与 const 关键字不同 const 字段只能在该字段的声明中初始化 readonly 字段可以在声明或构造函数中初始化 因此 根据所使用的构造函数 readonly 字段可能具有不同的值 另外 const 字段为编译时常数 而 readonly 字段可用于运行时常数

  根据这段话 readonly 字段是可以在运行时更改的 因此 readonly 在除构造函数外的函数中肯定也可以发生改变

  我们不仿来看看 readonly 字段 是怎么改变的

  

  

  进入 Change 函数之后我们可以发现 变量  f  的地址并未发生改变 同时 this关键字指身的地址 与传入的参数 data 相同

  

  

  执行完 data = new Fuck(value) 之后 this关键字指向的地址 data指向的地址仍然没有改变 但是该地址的值发生了变化

  

  这么看来 问题就出在于 data = new Fuck(value) 这句话上 可能有些朋友对于 out 关键字很疑惑 其实跟 out 关键字并没有太大的关系

  这里又让我们回到了C#中对于值类型的处理上

  基于值类型的变量直接包含值 将一个值类型变量赋给另一个值类型变量时 将复制包含的值

  也就是说 在给 data 赋值的时候 C#将 new Fuck(value)  的值按地址复制到了data 所指向的地址中 这也是为什么把Fuck的声明改成了class之后 这个现象就并不存在了

  与引用类型变量的赋值不同 引用类型变量的赋值只复制对对象的引用 而不复制对象本身

  这么看来 要改变 readonly 的值并不需要这么复杂的过程

  轻轻修改一下代码

   unsafe static void Main(string[] args)

  

        Fuck f = new Fuck( );

        Fuck* pf = &f;

        int* p = (int*)pf;

        *p = ;

        f Change( out f);

        Console Read();

  

  运行结果是

  

  

cha138/Article/program/net/201311/13564

相关参考

知识大全 C#中abstract关键字的使用方法

C#中abstract关键字的使用方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  学习过C#

知识大全 正确理解C#中的关键字[1]

正确理解C#中的关键字[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!最近有人问到ref关键字

知识大全 正确理解C#中的关键字[2]

正确理解C#中的关键字[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  //  //MyCl

知识大全 正确理解C#中的关键字[3]

正确理解C#中的关键字[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  //  //MyCl

知识大全 C#中using关键字的使用介绍

C#中using关键字的使用介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对于using关

知识大全 深入浅出分析C#接口的作用

深入浅出分析C#接口的作用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#接口的作用  C#

知识大全 正确理解C#中的ref关键字(续)[2]

正确理解C#中的ref关键字(续)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!那么我们再来

知识大全 正确理解C#中的ref关键字(续)[1]

正确理解C#中的ref关键字(续)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!前几天写了一

知识大全 c#中的params关键字的应用

  要接受未知数目的参数可以使用关键字params该关键字用于参数列表中声明参数列表最后面的值params关键字与数组一起使用  当值被传递给方法时编译器首先查看是否有匹配的方法如果有则调用该方法如果

知识大全 横向技术分析C#、C++和Java优劣

横向技术分析C#、C++和Java优劣  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#诞生之