Reference 参考类型列表<;T>;按命令

Reference 参考类型列表<;T>;按命令,reference,sql-order-by,Reference,Sql Order By,我有个奇怪的情况,我无法解释,有人能帮我理解吗? 根据我的理解,列表是一种参考类型,这意味着在我们更改功能评级内的列表后,该列表将在功能外更改。但在现实中,在我分类后它并没有改变。有什么我误解的问题吗 class Program { static void Main(string[] args) { List<User> data = new List<User> { new User { Tot

我有个奇怪的情况,我无法解释,有人能帮我理解吗? 根据我的理解,列表是一种参考类型,这意味着在我们更改功能评级内的列表后,该列表将在功能外更改。但在现实中,在我分类后它并没有改变。有什么我误解的问题吗

class Program
{
    static void Main(string[] args)
    {
        List<User> data = new List<User> 
        { 
            new User { TotalScore = 0 }, 
            new User { TotalScore = 3 }, 
            new User { TotalScore = 4 } 
        };
        Rating(data);
        //List data doesnt order descending by TotalScore
    }

    private static void Rating(List<User> data)
    {
        data = data.OrderByDescending(e => e.TotalScore).ToList();
    }
}

public class User
{
    public int Id { get; set; }
    public decimal TotalScore { get; set; }
}
类程序
{
静态void Main(字符串[]参数)
{
列表数据=新列表
{ 
新用户{TotalScore=0},
新用户{TotalScore=3},
新用户{TotalScore=4}
};
评级(数据);
//列表数据不按TotalScore降序排列
}
专用静态空隙率(列表数据)
{
data=data.OrderByDescending(e=>e.TotalScore.ToList();
}
}
公共类用户
{
公共int Id{get;set;}
公共十进制TotalScore{get;set;}
}

列表是一种引用类型,但不应将其与通过引用将参数传递给函数混淆。默认情况下,C#中的函数参数按值传递。您当前正在通过值将
数据
引用传递到
评级
,因此该函数中的
数据
变量是调用者中引用的副本。这允许函数通过引用改变相同的列表,但任何赋值只会影响局部变量

要通过引用传递变量,需要使用
ref
关键字:

private static void Rating(ref List<User> data)
{
    data = data.OrderByDescending(e => e.TotalScore).ToList();
}

评级(参考列表数据),试试thatHi Lee,谢谢你的回答。但我不认为问题来自ref关键字。因为如果我把评级改成这个,它会改变外部的数据变量。私有静态无效评级(列表数据){//data=data.OrderByDescending(e=>e.TotalScore.ToList();data.Add(新用户{TotalScore=4});}@user3697101-这不是您想要的吗?如果您只是想在适当的位置对列表进行变异,那么您需要使用
list.Sort
,因为
OrderByDescending(e=>e.TotalScore)。ToList()返回一个新列表。嗨,Lee,OrderByDescending(e=>e.TotalScore)。ToList()返回一个新列表,但随后将分配回数据变量,所以它应该在outsite中更改,而不使用ref关键字。因为在第二个示例(data.Add(新用户{TotalScore=4}))中,我仍然没有使用ref关键字,但它在外部发生了变化。所以我的问题是,这里使用OrderByDescending(e=>e.TotalScore).ToList()和data.Add(新用户{TotalScore=4})有什么不同;其中一个将在outsite中更改,但另一个不会更改。@user3697101-我的回答解释了为什么您需要在这里通过引用传递。您的两个示例并不相同—第一个示例尝试在外部作用域中指定一个变量,第二个示例只是通过引用的副本对对象进行变异。
Rating(ref data);