C#中数据集初始化的差异

时间:2020-03-05 18:51:32  来源:igfitidea点击:

这两种初始化对象的方式之间是否有区别(性能,开销):

MyTypedDataSet aDataSet = new MyTypedDataSet();
aDataSet .Merge(anotherDataSet);
aDataSet .Merge(yetAnotherDataSet);

MyTypedDataSet aDataSet = anotherDataSet;
aDataSet .Merge(yetAnotherDataSet);

我们推荐哪个?

解决方案

回答

这两行做不同的事情。

第一个创建一个新集合,然后将第二个集合合并到其中。

第二组将ds引用设置为指向第二组,因此:

MyTypedDataSet ds1 = new MyTypedDataSet();
ds1.Merge(anotherDataSet);
//ds1 is a copy of anotherDataSet
ds1.Tables.Add("test")

//anotherDataSet does not contain the new table

MyTypedDataSet ds2 = anotherDataSet;
//ds12 actually points to anotherDataSet
ds2.Tables.Add("test");

//anotherDataSet now contains the new table

好的,假设意思是:

MyClass o1 = new MyClass();
o1.LoadFrom( /* some data */ );

//vs

MyClass o2 = new MyClass( /* some data */ );

那么后者更好,因为前者在填充之前会创建一个空对象。

但是,除非初始化一个空类,否则代价高昂或者被重复了很多次,那么区别就不是那么重要。

回答

第二个示例未创建新的数据集。这只是对现有数据集的第二次引用。

回答

尽管基思(Keith)是对的,但我想这个例子被错误地选择了。通常,最好从头开始初始化为正确的对象,而不是像我们这样构造中间的空对象。两个原因:

  • 表现。这应该很明显:对象创建会花费时间,因此创建更少的对象会更好。
  • 但是,更重要的是,它可以更好地说明意图。我们通常不打算创建无状态/空对象。相反,我们打算创建具有某些状态或者内容的对象。做吧无需创建无用的(因为为空)临时文件。