装箱拆箱发作的性能损耗只针对于值类型吗

装箱拆箱产生的性能损耗只针对于值类型吗?


   static void Main(string[] args)
        {
            A a = new A() { name = "abc" };
            object obj = a;//这里只是将a的引用赋予obj。应该不存在性能消耗的问题吧?
            A a1 = (A)obj; //这里会产生性能消耗吗?我觉得只是做了下类型转换而已
        }

        public class A
        {
            public string name { get; set; }
        }



引用类型本身就是存储在堆上的,上述情况只能说是类型转换吧?

拆箱装箱这种说法是只针对值类型和引用类型间互转的操作吧?

恶补基础中,望大神指点
------解决思路----------------------
这种问题,网上一搜一大把,总比你在这傻等快多了吧
------解决思路----------------------
我的理解和你一样的~
装箱拆箱就是值类型在栈和堆之间跑来跑去

下面两本书有图解释这个过程
《CLR via C#》推荐这本,
《你必须知道的.net》

object obj = a;//我觉得和你一样 就分配多一个变量消耗不了多少
A a1 = (A)obj; //这个应该会~因为要判断是否真的能转换,不过应该也消耗不了多少
《CLR via C#》 有一个 类类型对象的概念

话说这么都是必须的~
特别是设计原则中 要对接口(父类)编程,不要对实现编程
所以转来转去是必须的~






------解决思路----------------------
如果你一味的强调高性能,就别用.net
研究更底层的开发语言吧,比如C之类的
这种性能开销,比起UI的显示刷新,通信的等待,一层一层封装的内存占用,根本都可以忽略不计
------解决思路----------------------
A a1 = (A)obj;
这里确实有性能损耗,所以某些时候应该尽量避免这种转换。
楼上很多人,基本都不关心性能问题。如果你有这方面的兴趣,就不必在意他们说的那些。
性能问题,有一半以上都是靠折腾细节。
比如.NET的快排修改一下参数传递方式,就能减少20%-25%的开销。
比如普通的Int32基数排序只有在很大数据量(比如千万级以上)的情况下才优于.NET快排,而如果你知道如何针对高速缓存做优化,也许简单的修改一下参数,运行效率就能提升10倍,对于随机数据运行时间可以降到.NET快排的1/8,数据量阀值可以降到200以内,完全满足常用数据量的要求。
如果楼主对细节优化感兴趣,可以看看fastCSharp,也欢迎大家一起交流,一起进步。
------解决思路----------------------
引用:
感谢楼上各位的解答,我自己也大概心理有个底


A a = new A() { name = "abc" };
            object obj = a;


我是认定一个思想,在这种情况下。

A为值类型时。才能算得上是装箱操作。

而A为引用类型时,我更加看成的是一种类型的转换。。

反之。。拆箱也一样。。

装箱拆箱本来就只是针对值类型,引用类型是不存在装箱拆箱的说法的,只有向上转型和向下转型的说法,并且引用类型的转换实质上本身是没有任何变化的,所以几乎不存在什么性能损耗
你可以这样想,值类型的转换如6.23到int型,那么就成了6,他才是真正意义上的转换,装箱拆箱虽然值没有变化但是总体来说还是会多点或者少点东西的
而引用类型的转换是从编译器角度讲的,从内存中看对象本身是不会有任何变化的
LZ参考下吧,可能讲的不专业,可能被别人拍砖
------解决思路----------------------
我觉得要搞清楚这个问题
得先弄明白两点,
object在这里算是什么类型?
object变量在哪里存储,堆还是栈?
"用类型是不存在装箱拆箱的说法的,只有向上转型和向下转型的说法"
装箱拆箱和转型不是一个概念吧?