首页 新闻 会员 周边 捐助

C# 关于引用传值的一个小问题..大家过来帮帮看看吧..

0
悬赏园豆:5 [已解决问题] 解决于 2013-09-10 11:44
我为DataTable写了一个很简单的扩展方法,但是结果却不是我想要的,
DataTable是引用类型对吧,是按引用传的...
但是请看代码..
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Data;

namespace Test
{
    static class Program
    {
        static void Main(string[] args)
        {
            DataTable x = null;
            x.NotNull();//在这加了断点跟踪,经过下边的扩展方法后,仍然为null,可是DataTable是按引用传的啊,实在想不通,请问这是为什么啊?
            Console.Read();
        }
        static public void NotNull(this DataTable dt)
        {
            if (dt == null)
            {
                dt = new DataTable();
            }
        }

    }
}

写成下边这样就行了..可是不想这样写,它明明就是引用传递嘛,为什么非要加个ref ..

 

public static void NotNull(this DataTable dt, ref DataTable dtSrc)
        {
            if (dtSrc == null)
            {
                dtSrc = new DataTable();
            }
        }

 

 

 

hexllo的主页 hexllo | 菜鸟二级 | 园豆:318
提问于:2013-09-04 21:52
< >
分享
最佳答案
0

引用类型 内存分配 要弄清楚

DataTable x = null;  //x为分配在堆栈,其值分配在堆,为null,不分配。

 

x.NotNull();  

//调用该方法时, 是 x的一个副本,可以理解此时 堆栈中分配了一个变量DataTable dt,dt和x指向的托管堆为同一块。

但是 dt和 x在 堆栈中是 两块内存,此时 NotNull方法中为 dt赋值,dt指向了托管堆中另一个块内存,但是x还是没变。

 

收获园豆:2
Qlin | 老鸟四级 |园豆:2403 | 2013-09-05 08:48
其他回答(3)
0
收获园豆:1
路过秋天 | 园豆:4787 (老鸟四级) | 2013-09-04 22:47
0

楼上的博客正解。不过我是这样理解的,楼主的扩展方法相当于:public static void IsNull(DataTable t){}如果t为空,实际上是这样调用的:IsNull(null)。没结果就可以理解了。

收获园豆:1
会长 | 园豆:12463 (专家六级) | 2013-09-05 01:38
0

@Qlin他分析的很对。 补充一下ref,加了ref以后会把x在堆栈中的地址给传递过去,直接修改x的指向,就相当于C中指针的指针。因此你下面的这个方法会返回一个非空。

收获园豆:1
NET_zhaoqiang | 园豆:296 (菜鸟二级) | 2013-09-05 14:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册