首页 新闻 会员 周边 捐助

c#奇怪的问题。高手进

0
悬赏园豆:5 [已解决问题] 解决于 2013-02-23 15:48

为什么执行完set方法后.list还是为null

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        List<string> list = null;

        private void button1_Click(object sender, EventArgs e)
        {
            set(list);
        }

        private void set(List<string> l)
        {
            l = new List<string>();
        }
    }

彬彬@科比的主页 彬彬@科比 | 初学一级 | 园豆:43
提问于:2013-02-20 16:37
< >
分享
最佳答案
0

 List<string> list  虽然为引用类型,但是对应的对象不存在,也就是说系统肯本就还没有为它在堆上分配内存,在栈上也无其对应的引用。所以当为null的 List<string> list 做为参数实际上是穿了一个空,方法自己会为参数 l 创建一个临时变量。

收获园豆:5
滴答的雨 | 老鸟四级 |园豆:3660 | 2013-02-20 17:00
其他回答(6)
0

这是一定的 , set 只是创建 I

Yu | 园豆:12990 (专家六级) | 2013-02-20 16:55
0

list = l=null

然后set 后 l 指向了其他的内存

list 还是老样子 null

chenping2008 | 园豆:9836 (大侠五级) | 2013-02-20 17:09
0

你没 out或ref 。。

1行受影响 | 园豆:113 (初学一级) | 2013-02-20 17:42
0

增加 out 或 ref 吧

iceknp | 园豆:87 (初学一级) | 2013-02-20 18:01
0

上面的各位都是对的。

稍微补充一下:在C#里,方法的参数有引用传和值传两种。只有加了ref的才是引用传。值传时方法内部使用参数的副本,引用传世使用参数的引用。在你的代码里,set()方法的参数实际上传了list 变量的值,即指向null的内存地址(可以这样理解,实际上是一个包装过的指针),set()方法内部,l的值是null的内存地址,但l和之前的list是不同的。对l的操作不会影响list,但是由于l和list指向的地址是同一个,对l指向的地址的操作,同样会对list起作用。

 

碧落星痕 | 园豆:708 (小虾三级) | 2013-02-20 22:54

只有加了ref的才是引用传???大哥你没搞错吧。。。!!!

支持(0) 反对(0) 彬彬@科比 | 园豆:43 (初学一级) | 2013-02-22 00:05

@彬彬@科比: 

实际上,还有一个out,但是和ref不一样。带out的参数可以没有初值,其他和ref一样。

对于引用传和值传两个概念,实际上就是看方法接到的参数是对象本身还是对象的副本。

支持(0) 反对(0) 碧落星痕 | 园豆:708 (小虾三级) | 2013-02-22 21:42
0

增加 out 或 ref 

li-peng | 园豆:954 (小虾三级) | 2013-02-21 12:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册