【发布时间】:2021-04-30 10:45:51
【问题描述】:
请认为我们有一个名为 AddArr 的方法,它接受一个数组和几个值并将这些值添加到数组中。
喜欢这个
c#代码
public static void AddArr(string[] nums, params string[] n)
{
string[] l = new string[nums.Length + n.Length];
int j;
for (j = 0; j < nums.Length; j++)
{
l[j] = nums[j];
}
for (int h = 0; h < n.Length; h++, j++)
{
l[j] = n[h];
}
Array.Resize(ref nums, l.Length);
for (int f = 0; f < nums.Length; f++)
{
nums[f] = l[f];
}
}
但对于第 13 行
Array.Resize(ref nums, l.Length);
它只调整 string[]nums 方法的入口参数的大小,而不是调整真实数组的大小,例如请认为我们有这样的程序
string[] names = new string[3] { "Parsa", "Nikan", "Neda" };
AddArr(names, "Alex");
foreach (var val in names)
{
Console.WriteLine(val);
}
Console.WriteLine(names.Length);
运行程序后可以看到输出是
Parsa
Nikan
Neda
3
Alex 的名字还没有添加到数组中
如果您在方法中设置断点,您可以在编译方法的第 13 行后看到 nums(方法中的参数)它已调整大小,但是当方法的编译结束时,您可以看到名称(数组) '未调整大小,但我可以通过在 Main 方法中编写代码自己解决此问题,但我想在单独的方法中编写此代码并且我不想使用列表
【问题讨论】:
-
您需要声明
string[] nums参数作为参考:ref string[] nums。否则,数组引用的副本将传递给方法,Array.Resize()将修改该副本而不是实际引用。 -
你不能永远调整数组的大小; 根据定义,数组是固定大小的。最好使用
List<string> nums或类似名称,然后调用nums.Add(...);(是的,您可以使用Array.Resize之类的名称,但这个名称是骗人的:应该叫Array.CreateNewArrayWithDifferentSizeAndCopyTheData) -
我在文中说过我不想使用列表
-
@ParsaAghasi 这就像说“帮我用螺丝刀钉钉子;我在文中说过我不想用锤子”——我的意思是,当然,你可以,但这并不是做事的好方法
-
@ParsaAghasi 以更具建设性的方式重新表述:你不必回答这个问题,但我会非常好奇为什么你想以这种方式做事,因为目标听起来可能是基于一些误解。如果是这样,最好纠正误解并使用正确的工具来完成工作,而不是通过艰难的方式确切地学习如何做事。
标签: c# arrays function methods