理解C#引用类型

掉坑里了,因为对引用类型的理解不够深,导致了项目出现了Bug。

首先整理一下C#基础:引用类型赋值赋的是对象的指针,而值类型赋值是copy副本,这是引用类型和值类型的区别之一。

上代码:

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var obj = MyClassA.PropertyA;
 6             Console.WriteLine(string.Join(",", MyClassA.PropertyA.Foo));
 7             obj.Foo.RemoveAll(m => m == "e");
 8             Console.WriteLine(string.Join(",",MyClassA.PropertyA.Foo));
 9
10             Console.WriteLine(string.Join(",",MyClassA.PropertyA.Bar));
11             obj.Bar = obj.Bar.Where(m => m > 2).ToList();
12             Console.WriteLine(string.Join(",", MyClassA.PropertyA.Bar));
13
14             obj.Foo = new List<string> {"x", "y", "z"};
15             Console.WriteLine(string.Join(",", MyClassA.PropertyA.Foo));
16
17             Console.Read();
18         }
19     }
20     class MyClassA
21     {
22         static MyClassA()
23         {
24             PropertyA=new MyClassB();
25             PropertyA.Foo = new List<string> { "a", "b", "c", "d","e"};
26             PropertyA.Bar = new List<int> {1, 2, 3, 4, 5};
27         }
28         public static MyClassB PropertyA { get; private set; }
29     }
30
31     class MyClassB
32     {
33         public List<string> Foo { get; set; }
34         public List<int> Bar { get; set; }
35     }

不容易理解的是:我明明操作的是obj的内部成员,为什么连MyClassA.PropertyA的成员值也被改了?

因为,当MyClassA.PropertyA赋值给obj时,obj就指向了MyClassA(引用类型),所以后面只要是对obj成员的操作,其实就是在操作MyCalssA的内部成员。

时间: 2024-10-18 01:25:24

理解C#引用类型的相关文章

从一个简单例子来理解js引用类型指针的工作方式

? 1 2 3 4 5 6 7 <script> var a = {n:1};  var b = a;   a.x = a = {n:2};  console.log(a.x);// --> undefined  console.log(b.x);// --> [object Object]  </script> 上面的例子看似简单,但结果并不好了解,很容易把人们给想绕了--"a.x不是指向对象a了么?为啥log(a.x)是undefined?".&

深入理解Java引用类型

深入理解Java引用类型 在Java中类型可分为两大类:值类型与引用类型.值类型就是基本数据类型(如int ,double 等),而引用类型,是指除了基本的变量类型之外的所有类型(如通过 class 定义的类型).所有的类型在内存中都会分配一定的存储空间(形参在使用的时候也会分配存储空间,方法调用完成之后,这块存储空间自动消失), 基本的变量类型只有一块存储空间(分配在stack中), 而引用类型有两块存储空间(一块在stack中,一块在heap中),在函数调用时Java是传值还是传引用,这个估

关于接口是值类型还是引用类型的猜测

虽然工作也有几年时间了,但时常能暴露出基础知识薄弱的问题,因此,有空闲时间时总喜欢把缺下的功课补齐. 今天想讨论的是,接口到底是引用类型还是值类型. 要想说清楚接口到底是引用类型还是值类型,就需要先解释一下值类型跟引用类型. 值类型,简单理解就是继承自ValueType的类型,除过可空类型(如int?,bool?)外,值不能为null,通常情况下存储在栈中.而引用类型不从ValueType继承,其值可以为null,存储在托管堆中,由GC负责清理. 既然大致了解了什么是值类型和引用类型,或者说,值

C#理论知识 笔试准备 Day1

剩下十天左右时间,准备一下笔记题,也巩固一下基础知识.本想万一找不到合适的就在家脱产学到过年算了,后来想想确实没必要,就算年前不好找工作,无非是钱多钱少.路远路近的问题.实在找不到满意的,可以先凑合着工作两三个月,到转正时如果薪资什么的还达不到要求,到时年初比较好找工作. 对着书也看不出什么来,就在网上找找笔试面试题,简单的看看就算了,有些经典的有代表性的,随手记录下来. 主要是看园内”汉城节度使“去年四月的长文,边看边记一些感想,有一些复制和删改.其余查的资料就不一一标明出处了. 一.喜闻乐见

js按值传递还是按引用传递?

js和其他大部分语言一样,有基本类型和引用类型.因此访问变量就有按值和按引用两种方式,但是传参的时候却只能按值传递.基本类型作为参数时按值传递自然无可厚非,但引用类型作为参数也按值传递就让人有点困惑了. 看下面这个例子: 1 function setName(obj){ 2 3 obj.name = "Sim"; 4 5 } 6 7 var person = new Object(); 8 9 setName(person); 10 11 alert(person.name); //&

程序员30岁能干嘛,程序员30岁后怎么办?

又是老话题,程序员30岁能干嘛,程序员30岁后怎么办?最近博客园里程序员过30岁能不能再写程序的帖子好像又火起来了.当年我刚入行做IT,看到的这类帖子,吓得不得了——差点就放弃了,还好我胆子大.所以今天有空,再看到这样的帖子,总是忍不住要多说几句. 我大学里学的专业是国际贸易,毕业后主要是做律师,也比较深入的涉足过装饰行业,几年前转行做了IT. 所以,我想,关于这个话题,我能给大家一个不同视角的启示.当然,个人意见,仅供参考,这本来就是一个仁者见仁,智者见智的话题. 下面我就以下一些常见的观点逐

JavaScript手札:《编写高质量JS代码的68个有效方法》(一)(1~5)

编写高质量JS代码的68个有效方法(一) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { marg

【转】程序员30过后

程序员30过后 最近博客园里程序员过30岁能不能再写程序的帖子好像又火起来了.当年我刚入行做IT,看到的这类帖子,吓得不得了--差点就放弃了,还好我胆子大.所以今天有空,再看到这样的帖子,总是忍不住要多说几句. 我大学里学的专业是国际贸易,毕业后主要是做律师,也比较深入的涉足过装饰行业,几年前转行做了IT. 所以,我想,关于这个话题,我能给大家一个不同视角的启示.当然,个人意见,仅供参考,这本来就是一个仁者见仁,智者见智的话题. 下面我就以下一些常见的观点逐个的谈一谈. 1. 程序员的门槛低.

浅析MSIL中间语言——基础篇

一.开篇 研究MSIL纯属于个人喜好,说在前面MSIL应用于开发的地方很少,但是很大程度上能够帮着我们理解底层的原理,这是我了解MSIL的主要原因.托管代码表示应用程序的方法的功能,它们以微软的中间语言(Microsoft intermediate language,MSIL)或公共语言运行(common intermediate language,CIL)的抽象二进制形式进行编码. MSIL代码由CLR“托管”.CLR托管至少包括三个主要的活动:类型控制,结构化异常和垃圾收集.类型控制设计在执