当前位置:编程学习 > C#/ASP.NET >>

请叫一个关于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的内存地址。


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在栈中位置。

--------------------编程问答-------------------- 长见识,学习了。 --------------------编程问答-------------------- 引用类型是在拖管堆上分配,值/结构则在进程栈中分配。 --------------------编程问答-------------------- 3楼再详细不过了 --------------------编程问答-------------------- tt=10,
把10写入tt指定的内存地址 --------------------编程问答--------------------
引用楼主 wnn349308824 的帖子:
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的内存地址吧。 
如果不是,那么具体的内存分配和它的值是什么?谢谢

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
        } 


--------------------编程问答--------------------
引用 8 楼 dahai99007 的回复:
引用楼主 wnn349308824 的帖子:
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的内存地址吧。 
如果不是,那么具体的内存分配和它的值是什么?谢谢 
 

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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,