我知道类是引用类型,所以ObjectA和ObjectB的值应该是一样的,可是为什么运行后A和B的值都是20,而不是10呢?我是按照=运算符的规则来理解的,还希望哪位大虾可以指点一下using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication36
{
    class Myclass
    {
        public int val;
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Myclass ObjectA = new Myclass();
            Myclass ObjectB = ObjectA;
            ObjectA.val  = 10;
            ObjectB.val  = 20;
            Console.WriteLine("{0}", ObjectA.val);
            Console.WriteLine("{0}", ObjectB.val);
            Console.ReadKey();
        }
    }
}

解决方案 »

  1.   

    Myclass ObjectA = new Myclass();//你实例化了一个Myclass,运行时在堆中建立了这个实例,注意的是 val是分配在堆上的。
    Myclass ObjectB = ObjectA;//你声明了一个ObjectB 指向了刚刚那个堆上的地址,ObjectB 和ObjectA都指向同一个地址
    ObjectA.val = 10;//堆上的一个四字节的地方被你赋予了10这个值
    ObjectB.val = 20;//你又将他改为了20
      

  2.   

    A和B就是一个东西 你要加一个ObjectA.val = 30;输出就是30,30了
      

  3.   

    Myclass ObjectB = ObjectA;引用类型指向同一段内存,不产生副本。
    所以你改其中的一个值,那么另外一个也跟着变了。
    想实现一个20,一个30的话,那就序列化,然后反序列化创建一个副本。