可以对某些数组排序,但不能对其他数组排序

本文关键字:数组排序 但不能 其他 | 更新日期: 2023-09-27 18:02:25

我正在按反向字母顺序对文本框的行进行排序,并且我的代码工作得很好:

string[] temp = textBox.Lines;
Array.Sort(temp);
Array.Reverse(temp);
textBox.Lines = temp;

但是我很困惑为什么Visual Studio不让我这样做:

Array.Sort(textBox.Lines);
Array.Reverse(textBox.Lines);

我主要是想弄清楚c#的微妙之处,因为我还是个新手。

编辑:第二个片段没有错误,但它不执行任何代码(即似乎没有做任何事情)。

可以对某些数组排序,但不能对其他数组排序

以下是TextBox.Lines的几行getter:

public string[] Lines
{ 
    get
    { 
        string text = Text;
        ArrayList list = new ArrayList();
        ...
        ...
        return(string[]) list.ToArray(typeof(string));
    }

您将获得一个新的集合,它具有来自TextBox的数据的副本。您实际上并没有对TextBox中的数据进行排序。

void Array.Sort对从该属性返回的数组进行排序时,原始TextBox保持不变。

确实,您的数组将被排序和反转,但发生的是不会分配给TextBox。修改Lines数组没有效果,因为它是计算属性。

你需要将它分配给Lines属性来查看效果。

来源

这是因为textBox。Lines不是作为类的成员变量公开的,而是作为属性公开的。在幕后,属性实际上是两个方法,例如get_Lines和set_Lines。关于get_Lines返回的数组,你只知道它是一个字符串数组。不能保证该属性是由一个实际的数组支持的——也许TextBox内部将文本保存为一个大字符串,然后在调用get_Lines时为您分解成几个部分。因此,当您对get_Lines的结果调用Sort()和Reverse()时,您不必修改内部列表。