C# 理解列表被更改为作为引用C传递的原因
也许有人能帮我,我真的很为难 我有一个名为TextFunc的类,它包含两个函数 第一个函数读取一个文件路径并返回一个列表 第二个函数将该列表作为参数,并返回一个float[,]。在这个函数中,我删除了列表的第一项,因为我对标题不感兴趣 我的问题是,我的第二个函数以某种方式修改了原始列表 因此,如果我在第二个函数之前显示列表的第一项,它将显示我所期望的 在第二个功能之后,第一个项目就消失了 我不明白为什么,因为我在将参数传递到第二个函数时没有使用引用。我甚至没有在第二个函数中调用相同的名称或任何东西 我的类包含两个函数,看起来像这样,只保留了相关部分:C# 理解列表被更改为作为引用C传递的原因,c#,list,C#,List,也许有人能帮我,我真的很为难 我有一个名为TextFunc的类,它包含两个函数 第一个函数读取一个文件路径并返回一个列表 第二个函数将该列表作为参数,并返回一个float[,]。在这个函数中,我删除了列表的第一项,因为我对标题不感兴趣 我的问题是,我的第二个函数以某种方式修改了原始列表 因此,如果我在第二个函数之前显示列表的第一项,它将显示我所期望的 在第二个功能之后,第一个项目就消失了 我不明白为什么,因为我在将参数传递到第二个函数时没有使用引用。我甚至没有在第二个函数中调用相同的名称或任何东
class TextFunc
{
public static List<string> ParseText(string filePath)
{
List<string> lines = File.ReadAllLines(filePath).ToList();
//do some stuff
return lines;
}
public static float[,] txt2Array(List<string> txtList)
{
txtList.RemoveAt(0);
// do some stuff
return floatArray;
}
}
我从Form1.cs中的buttonclick事件调用类似这样的函数
public partial class BRkData : Form
{
public BRkData()
{
InitializeComponent();
}
private void BRkData_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
List<string> txtFile = TextFunc.ParseText(@"C:\org_data.res");
MessageBox.Show(txtFile[0]); // here it displays what I expect
float[,] floatArr = TextFunc.txt2Array(txtFile);
MessageBox.Show(txtFile[0]); // here the first item of the list is gone?
}
}
我甚至尝试在txt2Array函数中复制列表,但这并不重要。不知何故,这就像我在不知情的情况下向该函数发送了对列表的引用。当我试图在函数中复制它时,我不知道必须使用ToList命令 List txtList=txtList_org.ToList
感谢您的澄清,并为我指明了正确的方向 这样想吧。有一个叫列表引用类型object的人,他知道一个好酒吧的列表。你在一张纸上有他的电话号码 调用方法就像将电话号码给其他人一样。他们把它写在不同的纸上,但同一个人接电话
使用ref关键字传递意味着你给了对方同样的纸张。他们可以划掉原来的电话号码,放入一个新的号码,然后返回给您。List txtList是对该对象的引用。当您对该对象调用方法时,它可能会修改该对象,因为它没有副本。因为List是一个类,因此是一个引用类型,所以当您将它传递给一个方法时,您正在创建对同一对象的另一个引用,而不是创建该对象的副本。@Liam-string不是值类型。它是一个不可变的引用type@UnholySheep它没有潜力;该对象将被修改。@好的,只是如果OP正在学习引用类型和值类型可能会混淆。