//Main_4_2_4 public static void Main_4_2_4() { //�ڴ�������̵߳Ķ�ջ�� //������ֵΪ�ȼ�"0"��ʵ�� MyStruct myStruct = new MyStruct(); //���̵߳Ķ�ջ�ϴ��������ã���δָ���κ�ʵ�� MyClass myClass; //�ڴ�������йܶ��� myClass = new MyClass(); //�ڶ�ջ���ij�Ա myStruct.MyNo = 1; //��ָ��ָ���йܶ� myClass.MyNo = 2; myStruct.ShowNo(); myClass.ShowNo(); //�ڶ�ջ���½��ڴ棬��ִ�г�Ա���� MyStruct myStruct2 = myStruct; //�������õ�ַ MyClass myClass2 = myClass; //�ڶ�ջ����myStruct��Ա myStruct.MyNo = 3; //���йܶ����ij�Ա myClass.MyNo = 4; myStruct.ShowNo(); myClass.ShowNo(); myStruct2.ShowNo(); myClass2.ShowNo(); #region 03. ����ת�� MyStruct MyNum; int i = 100; MyNum = (MyStruct)i; Console.WriteLine("������ʽת��ΪMyStruct��---"); Console.WriteLine(i); MyClass MyCls = new MyClass(200); string str = MyCls; Console.WriteLine("MyClass����ʽת��Ϊstring��---"); Console.WriteLine(str); #endregion #region 04. ʹ��sizeof�ж�ֵ���ʹ�С //unsafe //{ // Console.WriteLine("ʹ��sizeof�ж�ֵ���ʹ�С---"); // Console.WriteLine(sizeof(MyStruct)); //} #endregion #region 05 �����е� Console.WriteLine("�����е�---"); // 05.1 ReferenceEquals�е� //ֵ�������Ƿ���false����������װ���myStruct������ָ��ͬһ��ַ Console.WriteLine(ReferenceEquals(myStruct, myStruct)); //ͬһ�������Ͷ���ָ��ͬ�����ڴ��ַ Console.WriteLine(ReferenceEquals(myClass, myClass)); //RefenceEquals��Ϊnull����null����˷���true Console.WriteLine(ReferenceEquals(null, null)); // 05.2 Equals�е� //���ص�ֵ�����еȷ�������Ա��С��ͬ Console.WriteLine(myStruct.Equals(myStruct2)); //���ص����������еȷ�����ָ��������ͬ Console.WriteLine(myClass.Equals(myClass2)); #endregion #region 06 �������յļ��� //ʵ�����弰��ʼ�� MyClass mc1 = new MyClass(); //��������ʵ�廯 MyClass mc2; //�������ã�mc2��mc1ָ��ͬһ�йܵ�ַ mc2 = mc1; //������һʵ��������ɳ�ʼ�� MyClass mc3 = new MyClass(); //���ÿ�����mc1��mc2ָ�����µ��йܵ�ַ //��ôԭ���ĵ�ַ��ΪGC���յĶ����� mc1 = mc3; mc2 = mc3; #endregion }
public static void Main_4_2_4()//Main_4_2_4 { //内存分配于线程的堆栈上 //创建了值为等价"0"的实例 MyStruct myStruct = new MyStruct(); //在线程的堆栈上创建了引用,但未指向任何实例 MyClass myClass; //内存分配于托管堆上 myClass = new MyClass(); //在堆栈上修改成员 myStruct.MyNo = 1; //将指针指向托管堆 myClass.MyNo = 2; myStruct.ShowNo(); myClass.ShowNo(); //在堆栈上新建内存,并执行成员拷贝 MyStruct myStruct2 = myStruct; //拷贝引用地址 MyClass myClass2 = myClass; //在堆栈上修改myStruct成员 myStruct.MyNo = 3; //在托管堆上修改成员 myClass.MyNo = 4; myStruct.ShowNo(); myClass.ShowNo(); myStruct2.ShowNo(); myClass2.ShowNo(); #region 03. 类型转换 MyStruct MyNum; int i = 100; MyNum = (MyStruct)i; Console.WriteLine("整形显式转换为MyStruct型---"); Console.WriteLine(i); MyClass MyCls = new MyClass(200); string str = MyCls; Console.WriteLine("MyClass型隐式转换为string型---"); Console.WriteLine(str); #endregion #region 04. 使用sizeof判断值类型大小 //unsafe //{ // Console.WriteLine("使用sizeof判断值类型大小---"); // Console.WriteLine(sizeof(MyStruct)); //} #endregion #region 05 类型判等 Console.WriteLine("类型判等---"); // 05.1 ReferenceEquals判等 //值类型总是返回false,经过两次装箱的myStruct不可能指向同一地址 Console.WriteLine(ReferenceEquals(myStruct, myStruct)); //同一引用类型对象,将指向同样的内存地址 Console.WriteLine(ReferenceEquals(myClass, myClass)); //RefenceEquals认为null等于null,因此返回true Console.WriteLine(ReferenceEquals(null, null)); // 05.2 Equals判等 //重载的值类型判等方法,成员大小不同 Console.WriteLine(myStruct.Equals(myStruct2)); //重载的引用类型判等方法,指向引用相同 Console.WriteLine(myClass.Equals(myClass2)); #endregion #region 06 垃圾回收的简单阐释 //实例定义及初始化 MyClass mc1 = new MyClass(); //声明但不实体化 MyClass mc2; //拷贝引用,mc2和mc1指向同一托管地址 mc2 = mc1; //定义另一实例,并完成初始化 MyClass mc3 = new MyClass(); //引用拷贝,mc1、mc2指向了新的托管地址 //那么原来的地址成为GC回收的对象,在 mc1 = mc3; mc2 = mc3; #endregion }