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(); } }
引用类型 内存分配 要弄清楚
DataTable x = null; //x为分配在堆栈,其值分配在堆,为null,不分配。
x.NotNull();
//调用该方法时, 是 x的一个副本,可以理解此时 堆栈中分配了一个变量DataTable dt,dt和x指向的托管堆为同一块。
但是 dt和 x在 堆栈中是 两块内存,此时 NotNull方法中为 dt赋值,dt指向了托管堆中另一个块内存,但是x还是没变。
楼上的博客正解。不过我是这样理解的,楼主的扩展方法相当于:public static void IsNull(DataTable t){}如果t为空,实际上是这样调用的:IsNull(null)。没结果就可以理解了。
@Qlin他分析的很对。 补充一下ref,加了ref以后会把x在堆栈中的地址给传递过去,直接修改x的指向,就相当于C中指针的指针。因此你下面的这个方法会返回一个非空。