1. 是数值。
2. 不知道什么意思。任何变量都可以这样使用可实例化的类型来声明啊?!例如可以写 SqlConnection a; 来定义变量a。
3. 没有看到上下文,谁知道你断章取义的是什么时候的话呢?!一条 int a=10; 语句就会在运行时创建这个值,并且如果必要的话(如果寄存器不够用的话)会被放入栈中。如果说计算 string.Format("a={0}",a) 这种结果,才是先装箱然后去调用Format方法的。但是这种装箱操作是你需要付出的代价,不付出代价怎么会有收获(Format的结果)?
4. “类的对象应该在堆上”这是什么意思?不懂。引用对象其实际的内容在堆上分配(而且是随时浮动的,而不是固定地址的),但是其引用肯定是在栈上啊?!这里的引用,跟c语言的所谓地址完全是两回事。.net的引用最极低地也是“地址的地址”,是地址的非常间接的引用,分配在堆上的对象的物理地址随便浮动,而引用不变。在描述中,会有各种“简称”。例如a明明只是变量,有时候我们说“对象a”省去了说“变量a所代表的对象”。有时候我们说“对象a的地址是浮动的”是省去了说“分配在堆上的变量a所代表的具有引用类型的那个对象的内容部分的地址是浮动的。
解决方案 »
- 这个this 是什么意思?
- [求助]DevExpress的TextEdit控件使用正则表达式后无法输入中文
- winform 气泡
- 关于GDI绘图的问题。
- 如何把errorprovider控件绑定到textbox?
- 怎样按日期查询DateTime格式的时间?
- 初学VC++,有好书推荐吗?我工作经验一年,本是搞C#的,现在经理叫我选择以后做C#或VC,请老手给点建议!
- Microsoft .NET Framework 4.0不用上网的完全安装包。
- 高分请教:作为 web 服务的报表问题
- 类型转换的问题
- excel绑定sqlserver 后,在listobject (tableadapter)中排序并编辑会出问题
- textbox Keydow事件
自动进行装箱拆箱时,也是成对使用的,不必要过多考虑.
当然不是,int * a = &(new int());才是
②有人说,int是个静态类,所以可以 int a;这个说法对吗?
不是,int是简单类型,ValueType
③ 版主说,int 是值类型,在编译的时候会自动进行装箱拆箱,请问int a=10在编译时会被装箱成对象吗(如果这样岂不是更复杂了)?
对
④ 一方面:int是值类型,int a 定义在栈上;另一方面int又继承自Object类,是个类,类的对象应该在堆上。这不是矛盾嘛?
值类型并不一定在堆栈上
但(内存上的)逻辑划分它有是值类型,所以它的内存分配在栈上,而不是堆上计算机在运行的时候,其实内存也是一片连续的地址,物理上也没有堆栈之分的
出于分配内存和回收内存的方便,所以就把内存分为堆和栈(逻辑划分)一开始也没有面向对象语言的,后来有了面向对象语言,
C++可以多继承,C#不可以,并且规定所有都是继承Object
但计算机分配内存的逻辑才不会因为你多诞生几种语言而改变
也就是语言只会遵守计算机分配内存的逻辑,而不是计算机遵守语言定下来的概念所以说int 继承了Object,只是C#的规定
而计算机在运行的时候把int分配在栈上,会有冲突么?
object o = 1;这样才会把1分配在堆上有人说,int是个静态类,所以可以 int a;
肯定不是因为静态类的原因,而是语法的原因,
简单来说就是为了偷懒 ,少写代码, 所以这样规定的,是不是很惊讶,
没有什么高大上的东西,就是人类为了偷懒。哇咔咔我为什么知道上面的内容,推荐几本书,你可以看看
《汇编语言(王爽第二版)》 这本书会告诉你 物理内存为什么会被逻辑划分为堆和栈
《CLR via C#》 这本书会告诉 C#值类型和引用类型怎么分配在堆和栈上,和怎么转换《c++ programming》C++的设计者写的书,会告诉你他怎么设计C++的,很难懂,
只是想告诉你
int a 真的只是人类为了偷懒,
1. 是数值。
2. 不知道什么意思。任何变量都可以这样使用可实例化的类型来声明啊?!例如可以写 SqlConnection a; 来定义变量a。
3. 没有看到上下文,谁知道你断章取义的是什么时候的话呢?!一条 int a=10; 语句就会在运行时创建这个值,并且如果必要的话(如果寄存器不够用的话)会被放入栈中。如果说计算 string.Format("a={0}",a) 这种结果,才是先装箱然后去调用Format方法的。但是这种装箱操作是你需要付出的代价,不付出代价怎么会有收获(Format的结果)?
4. “类的对象应该在堆上”这是什么意思?不懂。引用对象其实际的内容在堆上分配(而且是随时浮动的,而不是固定地址的),但是其引用肯定是在栈上啊?!这里的引用,跟c语言的所谓地址完全是两回事。.net的引用最极低地也是“地址的地址”,是地址的非常间接的引用,分配在堆上的对象的物理地址随便浮动,而引用不变。在描述中,会有各种“简称”。例如a明明只是变量,有时候我们说“对象a”省去了说“变量a所代表的对象”。有时候我们说“对象a的地址是浮动的”是省去了说“分配在堆上的变量a所代表的具有引用类型的那个对象的内容部分的地址是浮动的。------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C#中任何类型的超类都是Object,int类型等值类型本质其实是struct 类,而struct类是一个sealed类,而struct类继承自ValueType类,无法被继承.之所以可以写int i = 1;这样的语法,这只是微软编译器给我们一种简便的申明赋值语法,反编译之后我们就可以看到其中的真相.微软的语法糖有很多.struct类是值类型,值类型与引用类型的区别就在于存储的栈和堆上,装箱和拆箱也只是将值类型的对象在堆和栈上挪动而已.