1、哪些变量是放在栈,哪些放堆
c#中的变量可以分为值类型和引用类型,值类型包括:简单类型,结构类型和枚举类型,引用类型包括类,数组,接口。
值类型在栈中操作,而引用类型在堆中操作,静态变量放全局区。栈在编译时分配内存空间,而堆是在运行时动态分配内存空间,可以根据程序的运行情况动态的分配内存的大小,因此,值类型在内存中占用一个预定义的字节数,栈是先入后出的,栈中上面的变量总是比下面的变量先离开作用域。
class Program
{
static void Main(string[] args)
{
swamp x = new swamp();
x.myvalue = 3;
swamp y = new swamp();
y = x;//此时,把x的在栈中的对象的地址给了y,此致他们两个都指向同一个存储对象数据的内存块;
y.myvalue = 4;
Console.WriteLine(x.myvalue);//输出的那自然而然就是4;
}
}
class swamp
{
public int myvalue;
}
2、值的交换
(1)在方法内部进行交换,改变的只是其副本的值,但是在栈内存中,它们的值并未改变
class Program
{
static void Main(string[] args)
{
int a = 5;
int b = 6;
swap(a, b);
Console.WriteLine("内存的a和b的值为 : a={0},b={1}", a, b);
}
public static void swap( int a,int b)
{
int temp = a;
a = b;
b = temp;
Console.WriteLine("在方法内部交换后其副本的值为 : a={0},b={1}",a,b);
}
//运行结果如下
//在方法内部交换后其副本的值为 : a=6,b=5
//内存的a和b的值为 : a=5,b=6
}
(2)想要在方法内部进行交换改变其内存中的值,就要用到ref,ref的意思为引用参数,其实完全可以不用去理解它是什么意思,如果你想在副本的值改变的同时改变内存的值时候,就是用它,关键就是在使用值类型前面加上ref这个关键字(注:ref和out的唯一区别就是,前者要赋初值,后者不用赋初值)
class Program
{
static void Main(string[] args)
{
int a = 5;
int b = 6;
swap(ref a, ref b);
Console.WriteLine("内存的a和b的值为 : a={0},b={1}", a, b);
}
public static void swap(ref int a,ref int b)
{
int temp = a;
a = b;
b = temp;
Console.WriteLine("在方法内部交换后其副本的值为 : a={0},b={1}",a,b);
}
//运行结果如下
//在方法内部交换后其副本的值为 : a=6,b=5
//内存中的a和b的值为 : a=6,b=5
}
最近关于C#的感悟就这些