c#中如何传递引用数据表

本文关键字:引用 数据表 何传递 | 更新日期: 2023-09-27 18:02:22

我在c#项目工作

我有两个这样的类:

public class A
{
    public DataTable dtA {get; set;}
}
public class B
{
    DataTable dtB{get;set;}
    public B(DataTable dt)
    {
        dtB = dt;
    }
}
static void Main()
{
    A a = new A();
    B b = new B(a.dtA);
}

I Want that dtB Be Exactly dtA (ref dtA)。但是在Up Code中,dtB是New DataTable,而不是dtA。(我想当更改dtB时,此更改也适用于dtA)

如何解决我的问题?


解决:

如果dtA为空并传递给dtB,则dtB将始终为空。(即使dtA填充了数据)但如果dtA不为空并传递给dtB,则dtB和dtA将来自一个源。

c#中如何传递引用数据表

你的代码可以正常工作,因为DataTable是一个引用类型。但是你需要注意,因为你很容易在这种情况下摔倒

void Main()
{
    A a = new A();
    a.dtA = new DataTable("TestTable");
    B b = new B(a.dtA);
    Console.WriteLine(b.TableName); // Same as A.dtA
    Console.WriteLine(a.dtA.TableName);  // Same as internal datatable in B
    a.dtA = new DataTable("SecondTable");
    Console.WriteLine(b.TableName);   // No more the same as A.dtA
    Console.WriteLine(a.dtA.TableName);
}
// Define other methods and classes here
public class A
{
    public DataTable dtA;
}
public class B
{
    DataTable dtB{get;set;}
    public B(DataTable dt)
    {
        dtB = dt;
    }
    public string TableName
    {
        get{ return dtB.TableName;}
        set{ dtB.TableName = value;}
    }
}

可以看到,更改A中的DataTable将使B中的DataTable仍然指向旧的引用,因此两者不再相同。查看Tim Schmelter的答案,以获得更好的方法。

try with ref

public B(ref DataTable dt)
{
    dtB = dt;
}

AB都指向相同的DataTable,这是因为所有的引用类型(如DataTable)都是通过引用传递的,所以你的代码应该工作得很好

如果你想使用相同的DataTable,你应该使用相同的A引用:

public class A
{
    public DataTable dtA;
}
public class B
{
    public A a;
    public B(A a)
    {
        this.a = a;
    }
}

现在两者都使用同一个表:

static void Main()
{
    A a = new A();
    B b = new B(a);
    Console.Write(a.dtA == b.A.dtA); //true
}

你也可以让B继承A,如果这是你真正想要的:

public class B: A
{      
}
static void Main()
{
    A a = new A();
    B b = new B();
    Console.Write(a.dtA == b.dtA); //true
}