Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据集合并之间的差异_C#_Object_Initialization_Dataset - Fatal编程技术网

C# 数据集合并之间的差异

C# 数据集合并之间的差异,c#,object,initialization,dataset,C#,Object,Initialization,Dataset,这两种合并数据集的方法之间是否存在差异(性能、开销) MyTypedDataSet aDataSet = new MyTypedDataSet(); aDataSet .Merge(anotherDataSet); aDataSet .Merge(yetAnotherDataSet); 及 你推荐哪一种?这两条线的功能不同 第一个创建一个新集合,然后将第二个集合合并到其中 第二组将ds引用设置为指向第二组,因此: MyTypedDataSet ds1 = new MyTypedDataSet(

这两种合并数据集的方法之间是否存在差异(性能、开销)

MyTypedDataSet aDataSet = new MyTypedDataSet();
aDataSet .Merge(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是对的,但我认为这个例子选择得很糟糕。通常,最好从一开始就初始化为“right”对象,而不是像您的情况那样构造一个中间的空对象。原因有二:

  • 表演。这应该是显而易见的:对象创建需要花费时间,所以创建更少的对象更好
  • 但是,更重要的是,它最好说明您的意图。您通常不打算创建无状态/空对象。相反,您打算创建具有某种状态或内容的对象。去做吧。不需要创建一个无用的(因为是空的)临时文件

  • 此外,对于某些情况(但不是示例),如果在创建时完全初始化对象,则对象可能是不可变的。标题完全错误-这不是关于对象初始化的问题,而是关于DataSet.Merge方法的问题
    MyClass o1 = new MyClass();
    o1.LoadFrom( /* some data */ );
    
    //vs
    
    MyClass o2 = new MyClass( /* some data */ );