【发布时间】:2016-09-13 18:11:11
【问题描述】:
我在传递 C# 函数参数时遇到问题。
我想知道如何让 C# 函数按值接受参数(以制作原始对象的副本)。
我认为这是 C# 处理这些事情的默认方式,但在以下代码中:
using System;
using System.Collections.Generic;
using System.Linq;
class MaximumElement
{
static void Main(string[] args)
{
Stack<int> numbers = new Stack<int>();
int n = int.Parse(Console.ReadLine());
for (int i = 0; i < n; i++)
{
string input = Console.ReadLine();
switch (input)
{
case "2": numbers.Pop(); break;
case "3": Console.WriteLine(maxElement(numbers)); break;
default:
string[] argz = input.Split(' ');
numbers.Push(int.Parse(argz[1]));
break;
}
}
}
public static int maxElement(Stack<int> stack)
{
int max = stack.Peek();
for (int i = 0; i < stack.Count; i++)
{
if (max >= stack.Peek())
{
stack.Pop();
}
else if (max < stack.Peek())
{
max = stack.Pop();
}
}
return max;
}
}
我的 maxElement() 函数实际上改变了我传递给它的原始堆栈,解决它的唯一方法是手动复制我在函数内部传递给函数的堆栈.
感谢您提前回复:)
【问题讨论】:
-
C#是按值传递参数,但参数是引用。如果你想复制,你需要明确地这样做。有关 C# 参数传递的详细信息,请参阅pobox.com/~skeet/csharp/parameters.html。
-
嘿,谢谢你的有用回答。有什么方法可以将我的堆栈作为值参数传递? (我猜我应该做一个等于“新”堆栈的堆栈?
-
已经是value参数了,value是一个引用。您需要区分参数传递和引用/值类型以及克隆。
new Stack<int>(stack)可能是前进的方向。
标签: c# function copy pass-by-value