扩展方法不赋值

And*_*ius 0 c# extension-methods variable-assignment

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

ds.Sort( "列");

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

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

    //sorting occurs

    ds = newDs.Copy();
} // <- breakpoint
Run Code Online (Sandbox Code Playgroud)

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

ds.Clear(); 
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 5

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

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

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

如果您不明白,请阅读有关参数传递的文章以获取更多详细信息.

你可能想要这样的东西:

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

    //sorting occurs
    return newDs; // No need to copy it *again*.
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

ds = ds.CopyAndSort("column");
Run Code Online (Sandbox Code Playgroud)