旗下导航:搜·么
当前位置:网站首页 > .Net教程 > 正文

C#基础知识整顿 基础知识(19) 值范例的装箱和拆箱(二)【C#.Net教程】,C#,基础知识整理,装箱和拆箱

作者:搜教程发布时间:2019-11-27分类:.Net教程浏览:32评论:0


导读:假如代码中会形成编译器的重复装箱,可改成手动装箱,如许来使代码实行更快,看下面代码://手动装箱Int32v=5;...
假如代码中会形成编译器的重复装箱,可改成手动装箱,如许来使代码实行更快,看下面代码:

            //手动装箱
            Int32 v = 5;

            //由于string.Format的参数是object范例,所以这里会形成三次装箱。
            Console.WriteLine(string.Format("{0},{1},{2}", v, v, v));

            //修正一下,固然这只是一个小技能,比方顺序中对同一个值的同一个操纵实行屡次,
            //应当都是要先实行一次,然后再运用的。
            Object o = v;//装箱一次

            Console.WriteLine(string.Format("{0},{1},{2}", o, o, o));

经由过程前面的代码段,我们再写顺序时就很轻易推断什么时候值范例要装箱。不过就是当要猎取一个值范例的援用时,就要装箱。这里也很清晰的可以看出值范例与援用范例的区分:
1、值范例不在托管堆中分派空间;而援用范例在实例化后就在堆上分派了类中指定的成员的的空间。
2、值范例没有堆上的对象的分外成员,即“范例对象指针”、“同步索引”。
未装箱的值范例没有同步索引,因而不能运用该范例地点类的要领(比方lock)让多个线程同步对这个实例的接见。
虽然未装箱的值范例没有范例对象指针,但仍可挪用由范例继续或重写的虚要领,比方Equals,GetHashCode,ToString。假如值范例重写了个中任何一个虚要领,那末CLR可以非虚地挪用该要领,由于值范例是隐式密封的,没有任何范例可以从它派生。另外,用于挪用虚要领的值范例实例不会被装箱。假如重写的虚要领要挪用要领在基类中的完成,那末在挪用基类的完成时,值范例实例会装箱。由于这些要领是有System.Object定义的,所以这些要领希冀this实参是指向堆上的一个对象的指针。
另外,将值范例的一个未装箱实例转型为范例的某个接口是,请求实例举行装箱。由于接口变量必需包括对堆上的一个对象的援用。看下面代码:

 class Program
    {
        static void Main(string[] args)
        {
            Point p1 = new Point(10, 10);

            Point p2 = new Point(20, 20);

            //挪用ToString不装箱,这里ToString是一个虚要领
            Console.WriteLine(p1.ToString());

            //GetType是一个非虚要领,p1要装箱
            Console.WriteLine(p1.GetType());

            //这里挪用的是public int CompareTo(Point p)
            //p2不会装箱
            Console.WriteLine(p1.CompareTo(p2));

            //p1要装箱,这就是将未装箱的值范例转为范例的某个接口时
            IComparable c = p1;

            Console.WriteLine(c.GetType());

            //这里挪用的是public Int32 CompareTo(Object o),
            //而且c原本就是一个援用,因而不装箱了
            Console.WriteLine(p1.CompareTo(c));

            //这里挪用的是c的CompareTo要领,参数是object型的
            //所以要对p2装箱
            Console.WriteLine(c.CompareTo(p2));

            //对c拆箱,并复制值到p2中
            p2 = (Point)c;

            Console.WriteLine(p2.ToString());
        }
    }
    
     internal struct Point : IComparable
    {
        private Int32 x;

        private Int32 y;

        public Point(Int32 x, Int32 y)
        {
            this.x = x;

            this.y = y;
        }

        public override string ToString()
        {
            return string.Format("{0},{1}", x, y);//这里装箱两次,不知道有没好办法。
        }

        public int CompareTo(Point p)
        {
            return Math.Sign(Math.Sqrt(x * x + y * y) - Math.Sqrt(p.x * p.x + p.y * p.y));
        }

        public Int32 CompareTo(Object o)
        {
            if (GetType() != o.GetType())
            {
                throw new ArgumentException("o is not Point.");
            }

            return CompareTo((Point)o);
        }
    }

以上就是C#基础知识整顿 基础知识(19) 值范例的装箱和拆箱(二)的内容,更多相关内容请关注ki4网(www.ki4.cn)!

标签:C#基础知识整理装箱和拆箱


欢迎 发表评论: