最近对值类型和引用类型之间的问题越来越迷惑了
具体问题有以下几个1,值类型是存储在堆栈上的,但在C#中,所有的东西都要包含在一个类当中,但类的空间是分配在托管堆中的。当实例化一个类的时候,这个类有一个值类型的变量,这个变量的内存分配到底是在托管堆中啊还是在堆栈中啊?2,struct是值类型的,但如果在struct当中有个string类型的变量,那这个string的变量到底是在哪分配空间啊?3,string 是个引用类型,有如下代码:
class Program
{
static void Main(string[] args)
{
string testone = "this is a test";
string testtwo = testone;
Console.WriteLine("testone is "+testone);
Console.WriteLine("testtwo is "+testtwo);
testone = "another string";
Console.WriteLine("testone is " + testone);
Console.WriteLine("testtwo is " + testtwo);
}
}这个时候,输出结果为
testone is this is a test
testtwo is this is a test
testone is another string
testtwo is this is a test既然string为引用类型,为什么改变了testone,但testtwo确没改变呢?
以上几个问题还希望高手能够指教
具体问题有以下几个1,值类型是存储在堆栈上的,但在C#中,所有的东西都要包含在一个类当中,但类的空间是分配在托管堆中的。当实例化一个类的时候,这个类有一个值类型的变量,这个变量的内存分配到底是在托管堆中啊还是在堆栈中啊?2,struct是值类型的,但如果在struct当中有个string类型的变量,那这个string的变量到底是在哪分配空间啊?3,string 是个引用类型,有如下代码:
class Program
{
static void Main(string[] args)
{
string testone = "this is a test";
string testtwo = testone;
Console.WriteLine("testone is "+testone);
Console.WriteLine("testtwo is "+testtwo);
testone = "another string";
Console.WriteLine("testone is " + testone);
Console.WriteLine("testtwo is " + testtwo);
}
}这个时候,输出结果为
testone is this is a test
testtwo is this is a test
testone is another string
testtwo is this is a test既然string为引用类型,为什么改变了testone,但testtwo确没改变呢?
以上几个问题还希望高手能够指教
解决方案 »
- 新手请教iframe中嵌套table的滚动问题
- 帮一下忙
- kill taskmanage.exe的时候怎么消除系统右下的图标啊
- 关于跨网段通信
- 急:关于循环为控件赋值,在线等
- 在局域网中用WebClient下载文件,如果对方有密码怎么办?
- ReadToEnd缓慢的问题...
- 送分贴
- 我打印多份图像(我只在一页上画出一张图)让打印机连续打印,如我设定成6张就连续打印6张(现在的方法是我连续发Print(),可是打印机会停一下),代码如何写呀、、
- Setup Factory 7.0在“安装之时”随进度条的进度切换图片的脚本怎样写
- 那位兄弟有FCKeditor的.net版
- 紧急求助!C#中FileStream如何保存?
2.struct中的引用类型也是分配在托管堆中,struct只是保留对他的引用而已
3.string是一个比较特殊的引用类型,
string testone = "this is a test";
string testtwo = testone;
这段代码分配了两个字符串空间,即testone指向一个"this is a test";testtwo指向另外一个"this is a test";所以当你改变了testone时,testtwo并没有被改变。你可以使用字付串驻留技术使他们指向同一个字符串。
打个比方
class test
{
public int i;
}当我实例化这个类,并且对i进行赋值后
test aa=new test();
aa.i=10;这里,显然aa这个类的实例是在托管堆上分配内存
那么,aa当中的这个int型的变量i,是在堆栈中还是托管堆中?
还是aa当中只保存了i的指针,i的内存分配还是在堆栈上?
using System;public class RefType
{
public int i;
}
class RefTypeTest
{
public static void Main()
{
RefType rect1 = new RefType();
rect1.i = 100;
RefType rect2 = rect1;
Console.WriteLine("rect2.i=" + rect1.i);
rect1.i = 200;
Console.WriteLine("rect2.i=" + rect1.i);
}
}
结果如下:
rect2.i=100
rect2.i=200
——————————————————
看来就算是对象中的int类型也是存在托管堆中的