扩展方法不赋值

时间:2013-07-30 09:53:21

标签: c# extension-methods variable-assignment

我的数据集有自定义排序方法。我称之为:

ds.Sort( “塔”);

其中ds的类型为dataset。然后我排序第一个表(排序代码本身不相关,因为断点显示结果是正确的)。我的排序方法如下:

public static void Sort(this DataSet ds, string column)
{
    DataSet newDs = ds.Copy();

    //sorting occurs

    ds = newDs.Copy();
} // <- breakpoint

在断点处,ds和newDs都按照应有的顺序排序。但是,一旦我向前移动并在调用此排序方法后到达该行,ds将不再排序。我也只是做了同样的尝试

ds.Clear(); 

在那个Sort方法中,这次它起作用了。我不允许为对象分配值吗?是否有可能以某种方式做到这一点?

2 个答案:

答案 0 :(得分:5)

  

我不允许为对象分配值吗?

您没有为对象分配值。您正在为变量分配值...并且该变量是一个参数。在该方法之外看不到对该参数值的更改,因为C#默认使用pass-by-value。例如,请考虑以下代码:

static void Foo(string input)
{
    input = "In Foo";
}
...
string text = "hello";
Foo(text);
Console.WriteLine(text); // Still prints "hello"

如果您不明白,请阅读my article on parameter passing了解更多详情。

你可能想要这样的东西:

public static DataSet CopyAndSort(this DataSet ds, string column)
{
    DataSet newDs = ds.Copy();

    //sorting occurs
    return newDs; // No need to copy it *again*.
}

然后你可以使用:

ds = ds.CopyAndSort("column");

答案 1 :(得分:2)

之间的区别
ds.Clear();

ds = newDs.Copy();

是第一个对您通过引用DataSet传入的ds对象进行操作,而第二个对象重新分配给该变量,使原始对象无法访问你的扩展方法。

您可以使用Merge方法作为后门来填充带有排序数据的原始数据集:

ds.Reset();
ds.Merge(newDs);

这样可行,因为数据会被复制到原始DataSet