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);