Exemplo n.º 1
0
 static void RefWithRef(ref object o)
 {
     o = new MyStruct();
     Console.WriteLine(o.ToString());
 }
Exemplo n.º 2
0
        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
        }
Exemplo n.º 3
0
        //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
        }
Exemplo n.º 4
0
 static void RefWithRef(ref object o)
 {
     o = new MyStruct();
     Console.WriteLine(o.ToString());
 }