1

我从事 C# 项目

我有 2 节课是这样的:

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);
}

我希望 dtB 完全是 dtA(参考 dtA)。但是使用 Up Code dtB 是新的 DataTable,而不是 dtA。(我希望在更改 dtB 时,此更改也适用于 dtA)

如何解决我的问题?


解决了:

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

4

4 回答 4

1

您的代码按您的预期工作,因为 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 的答案以获得更好的方法。

于 2013-03-05T09:53:03.840 回答
0

尝试参考

public B(ref DataTable dt)
{
    dtB = dt;
}
于 2013-03-05T09:44:30.193 回答
0

A和都B指向同一个DataTable,这是因为所有引用类型(as DataTable)都是通过引用传递的,所以你的代码应该可以正常工作。

于 2013-03-05T09:44:31.457 回答
0

如果你想使用相同的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
}
于 2013-03-05T09:45:35.433 回答