请叫一个关于Ref 的问题
public static void f(ref int tt){
tt = 10;
}
static void Main(string[] args)
{
int t = 100;
f(ref t);
Console.WriteLine(t);
}
在内存中什么位置给tt变量分配的位置,是栈还是托管推,它的值是t的内存地址吧。
如果不是,那么具体的内存分配和它的值是什么?谢谢 --------------------编程问答-------------------- 托管推
出了方法之后值也会随之改变 --------------------编程问答-------------------- 推 --------------------编程问答-------------------- ref t的确是t的内存地址。
--------------------编程问答-------------------- 长见识,学习了。 --------------------编程问答-------------------- 引用类型是在拖管堆上分配,值/结构则在进程栈中分配。 --------------------编程问答-------------------- 3楼再详细不过了 --------------------编程问答-------------------- tt=10,
static void Main(string[] args)
{
int t = 100; // t:栈。因为t是值类型
f(ref t); // ref t:即不是栈也不是堆,而是寄存器。因为CLR的默认函数调用规则是fastcall。
Console.WriteLine(t);
}
public static void f(ref int tt)
{
tt = 10; // 往ref tt指定的内存地址写入常数10,该内存地址就是Main中int t在栈中位置。
}
把10写入tt指定的内存地址 --------------------编程问答--------------------
public static void f(ref int tt)
{
tt = 10; //对t地址内的值操作
}
static void Main(string[] args)
{
int t = 100; // 声明一个int类型变量(值类型),在栈上分配一块内存存储
f(ref t); //引用传参,这传进去的是t的地址,这里的变量t不发生拷贝,直接对原来声明的t操作
Console.WriteLine(t); //所以输出的为10
}
public static void f(int tt)
{
tt = 10; //对t地址内的值操作
}
static void Main(string[] args)
{
int t = 100; // 声明一个int类型变量(值类型),在栈上分配一块内存存储
f(t); //值传参,这传进去的是t副本,在这里t发生了一个拷贝,对t的副本进行操作,t的副本改变,并没有影响到t本身的值
Console.WriteLine(t);//所以输出的是100
}
--------------------编程问答--------------------
public static void f(ref int tt)
{
tt = 10; //对t地址内的值操作
}
static void Main(string[] args)
{
int t = 100; // 声明一个int类型变量(值类型),在栈上分配一块内存存储
f(ref t); //引用传参,这传进去的是t的地址,这里的变量t不发生拷贝,直接对原来声明的t操作
Console.WriteLine(t); //所以输出的为10
}
public static void f(int tt)
{
tt = 10; //对t的副本操作,这儿写错了
}
static void Main(string[] args)
{
int t = 100; // 声明一个int类型变量(值类型),在栈上分配一块内存存储
f(t); //值传参,这传进去的是t副本,在这里t发生了一个拷贝,对t的副本进行操作,t的副本改变,并没有影响到t本身的值
Console.WriteLine(t);//所以输出的是100
}
--------------------编程问答-------------------- 学习了
补充:.NET技术 , C#