using System;
using System.Data;
using System.Collections;public class MyClass
{
public static void Main()
{
DataTable tb = new DataTable();
SetTableNull(tb);

string result = string.Empty;
if ( tb == null )
{
result = "DataTable is null";
}
else
{
result = "DataTable is not null";
}

Console.WriteLine(result);
Console.ReadLine();
}

public static void SetTableNull(DataTable dt)
{
dt = null;
}
}
以上这段代码,为什么SetTableNull函数始终没有发挥作用?引用类型传递的对象在其它函数中重新做譬如实例化或者付空的时候为什么会出现这样的结果?请麻烦讲讲

解决方案 »

  1.   

    晕...是传值的,当然没用啦.....
    用引用的..改:----------------------------------------SetTableNull(ref tb);public static void SetTableNull(ref DataTable dt)
    {
    dt = null;
    }
      

  2.   

    SetTableNull只是把传过来的一个DataTable值设为NULL,而该值的源并没有改变.
    这属于传值和传址的差别.
      

  3.   

    你没有理解清楚变量的作用域。
    public static void SetTableNull(DataTable dt)这里的 dt 只在 SetTableNull 方法里产生作用。DataTable tb = new DataTable();这里的 dt 在 Main 方法里产生作用。你如果想在 SetTableNull 方法里设置 DataTable tb = new DataTable(); 的 dt 的值的话。1.
    public static void SetTableNull(ref DataTable dt)
    {
    dt = null;
    }调用:
    DataTable tb = new DataTable();
    SetTableNull(ref tb);或者 2.public static DataTable SetTableNull(DataTable dt)
    {
    dt = null;
    return dt;
    }
    调用:
    DataTable tb = new DataTable();
    tb = SetTableNull(tb);
      

  4.   

    首先感谢各位的回答!不过各位批评我概念不清我倒是觉得挺冤枉,我倒觉得是各位把这个问题想的太简单了一点。
    .Net中有值类型和引用类型两种对象,DataTable属于引用类型的变量,这种变量的传递本身就是引用传递的,而不是上面各位说的传递的是副本。下面看这段代码,为了简化,把DataTable换成了TextBox对象,都是引用类型的,说明的是同样的问题
    using System;
    using System.Windows.Forms;
    using System.Collections;public class MyClass
    {
    public static void Main()
    {
    TextBox tb = new TextBox();
    tb.Text = "OldValue";
    SetNewValue(tb);

    string currentTbText = tb.Text;

    Console.WriteLine(currentTbText);
    Console.ReadLine();
    }

    public static void SetNewValue(TextBox tb)
    {
    //part1
    tb.Text = "NewValue"; //part2
    // tb = new TextBox();
    // tb.Text = "NewValue";

    //part3
    // TextBox otherTb = new TextBox();
    // otherTb.Text = "OtherValue";
    // tb = otherTb;

    //part4
    // tb = null;
    }
    }
    首先运行的是Part1部分的代码,楼上各位有没有发现,即使不使用ref关键字传递参数,传递的对象的Text属性仍然发生了变化,即起到了ref引用传递的效果。
    但是大家注释掉Part1,使用Part2,Part3甚至Part4的时候,也就是我在顶楼描述的 "重新做譬如实例化或者付空"这种情况,传入的对象就没有发生Part1代码中的效果。其实我想问的是这之间的差异是怎么造成的?欢迎楼上的各位继续参加讨论,顺便也强化下基础概念。
      

  5.   

    使用ref,你的函数并没有修改什么,你可以调试一下.
    值传递.
      

  6.   

    《Microsoft.Net 框架程序设计》 第五章
    清清楚楚
      

  7.   

    我当然不会犯这样的错误,各种结果我都已经总结过了。我在这里不是想问大家用怎样的方法来避免这个问题,而是期待知道为什么会出现这样的结果。楼上各位ref 和值的解释并不能完全解释Part1部分产生的结果。
      

  8.   

    请大家动手实验一下,我的代码已经写好了,大家在SnippetCompiler里可以直接运行一下就好了。
    请指出问题的关键,谢谢!
      

  9.   

    我觉得应该是这样:
    public static void SetTableNull(DataTable dt)
    {
    dt = null;
    }上面的dt是重新申请的一个指向的Main()中dt的一个地址当dt=null时,那就只是新申请的这个dt指向null,原来的dt指向不变;当赋值时,因为dt指向原来的dt那就是给原来的dt赋值,这样原来的dt也就变了
      

  10.   

    看看
    http://www.webjx.com/htmldata/2005-08-27/1125096594.html
      

  11.   

    ref---------------
    欢迊来到麦高网-私活兼职首选平台 www.mgao.net
      

  12.   

    UP to  xrascal(横刀夺爱)
      

  13.   

    不知道还能不能这样理解:有个地方,现在有个A路标指向这个地方,当传值时应该是再造一个路标B同样指向这个地方,当=null时就相当把B路标拔掉了,那A路标指向应该不会变。你的那个text例子就是:如果那个地方要开个商店了,你对你的助手说,去B路标指向的那个地方开个商店。
    商店开好之后如果路人来问A路标指向的那个地方有商店吗?你会毫不犹豫的说:那肯定有了!
      

  14.   

    dt = null是不过是设置了形参dt为空指针,实参并没有改变,而你的textbox的例子与这个不同,是调用了textbox内部的属性,你试试设置textbox = null看看那个textbox会不会消失,呵呵.