看看以下程序:
class Test
{
List<int> myList = new List<int>();
public void TestMethod()
{
myList.Add(100);
myList.Add(50);
myList.Add(10);
ChangeList(myList);
foreach (int i in myList)
{
Console.WriteLine(i);
}
}
private void ChangeList(List<int> myList)
{
myList.Sort();
List<int> myList2 = new List<int>();
myList2.Add(3);
myList2.Add(4);
myList = myList2;
}
}
Run Code Online (Sandbox Code Playgroud)
我假设myList已经过去了ref,输出会
3
4
Run Code Online (Sandbox Code Playgroud)
该列表确实"通过ref传递",但只有该sort函数生效.以下声明myList = myList2;无效.
所以输出实际上是:
10
50
100
Run Code Online (Sandbox Code Playgroud)
你能帮我解释一下这个行为吗?如果确实myList没有通过ref(因为它看起来myList = myList2没有生效),如何myList.Sort()生效?
我甚至假设该语句不生效,输出为:
100
50
10
Run Code Online (Sandbox Code Playgroud) 从C/C++迈出C#世界的第一步,细节上有点模糊.据我所知,类默认通过引用传递,但是例如.列出<string>,如:
void DoStuff(List<string> strs)
{
//do stuff with the list of strings
}
Run Code Online (Sandbox Code Playgroud)
和其他地方
List<string> sl = new List<string>();
//next fill list in a loop etc. and then do stuff with it:
DoStuff(sl);
Run Code Online (Sandbox Code Playgroud)
是SL在这种情况下按引用传递或者是副本上进行,这样我需要重新定义,如工人功能
void DoStuff(ref List<string> strs)实际上是对sl本身采取行动而不是副本?
假设我有以下代码,其中Car类只有1个属性: String modelname
Car c = new Car("toyota");
Car c1 = c;
Car c2 = c;
Car c3 = c;
Car c4 = c;
Car c5 = c;
Run Code Online (Sandbox Code Playgroud)
这是否每次都会制作一张新车?所以在记忆中会有一个新的"丰田"字符串5倍以上?或者"丰田"字符串只会在内存中一次?
编辑:添加此相关链接,以防您遇到与我相同的问题,我认为这有助于 数组或列表默认通过c#中的引用传递?
我有以下对象
var filters = new List<IReportFilter>
{
new ReportFilter
{
ReportColumn = new ReportColumn{ ColumnKey = "Result.IsCompleted"},
Value = "1",
SubFilters = new List<IReportFilter>
{
new ReportFilter { SqlOperator = FilterOperator.Or, ReportColumn = new ReportColumn{ ColumnKey = "User.LastName"}, Value = "Alhayek"},
new ReportFilter { SqlOperator = FilterOperator.Or, ReportColumn = new ReportColumn{ ColumnKey = "User.LastName"}, Value = "Smith"},
new ReportFilter { SqlOperator = FilterOperator.Or, ReportColumn = new ReportColumn{ AggregateFunction = SqlAggregateFunctions.Count}, Type = FilterType.GreaterThenOrEqualTo ,Value = "0" },
}
},
}; …Run Code Online (Sandbox Code Playgroud) 为什么我的代码数组值总是包含"0"?
static void Main(string[] args)
{
string Input = Console.ReadLine();
char[] Number = new char[3];
Util.SetNumber(Input,Number);
foreach (char digit in Number)
{
Console.WriteLine(digit);
}
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
这是班级:
class Util
{
public static void SetNumber(string Input,char[] Number)
{
Number = Input.ToCharArray();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果将"foreach"部分放在Util.cs中,它会写出值.
谢谢你,
在不更改byte [] numArray的情况下,即使字节保持完全相同,两个消息框也会显示不同的输出.我糊涂了.
第一个MessageBox的结果:stream:stream to =""version ="1.0"xmlns:stream ="http://etherx.jabber.org/streams">
第二个MessageBox的结果: F^ v
第三个MessageBox:"匹配"
MessageBox.Show(System.Text.Encoding.UTF8.GetString(numArray));
byte[] num1 = numArray;
byte[] encrypted = getEncryptedInit(numArray);
MessageBox.Show(System.Text.Encoding.UTF8.GetString(numArray));
byte[] num2 = numArray;
if (num1.SequenceEqual<byte>(num2) == true)
{
MessageBox.Show("Match");
}
Run Code Online (Sandbox Code Playgroud)