我是C#的新手。我用C#
中的参数尝试了这个using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class First
{
public void fun(out int m)
{
m *= 10;
Console.WriteLine("value of m = " + m);
}
}
class Program
{
static void Main(string[] args)
{
First f = new First();
int x = 30;
f.fun(out x);
}
}
但我收到一些错误,例如“使用未分配的参数'm'”和
必须在控件离开当前方法之前指定out参数“m”。
那么这些错误的含义是什么?当我已经为 x 指定了值时,为什么必须指定' m '。
答案 0 :(得分:18)
ref
表示您在调用方法之前传递对已声明 并初始化 的变量的引用,并且该方法可以修改该变量的值。
out
表示您在调用方法之前传递对已声明但 尚未初始化 的变量的引用,并且该方法必须在返回之前初始化或设置它的值。
答案 1 :(得分:4)
你得到并且错误,因为在方法调用之前不必初始化作为out
参数的变量发送到方法。以下是100%正确的代码:
class Program
{
static void Main(string[] args)
{
First f = new First();
int x;
f.fun(out x);
}
}
您好像在这里寻找ref
而不是out
:
class First
{
public void fun(ref int m)
{
m *= 10;
Console.WriteLine("value of m = " + m);
}
}
class Program
{
static void Main(string[] args)
{
First f = new First();
int x = 30;
f.fun(ref x);
}
}
答案 2 :(得分:2)
out
参数适用于函数想要传递自身值 out 的时间。你想要的是ref
,这是函数希望传入的时间,但可以改变它。
有关如何使用两者的示例,请阅读http://www.dotnetperls.com/parameter。它用简单的术语解释,你应该能够很好地理解它。
您应该注意,在您的代码中,您永远不会在函数调用之后访问变量,因此ref
实际上并没有执行任何操作。其目的是将更改发送回原始变量。
答案 3 :(得分:2)
从C#7.0开始,引入了一个在传递参数时将变量声明为out参数的能力。
在:
public void PrintCoordinates(Point p)
{
int x, y; // have to "predeclare"
p.GetCoordinates(out x, out y);
WriteLine($"({x}, {y})");
}
C#7.0
public void PrintCoordinates(Point p)
{
p.GetCoordinates(out int x, out int y);
WriteLine($"({x}, {y})");
}
您甚至可以使用var关键字:
p.GetCoordinates(out var x, out var y);
注意out参数的范围。例如,在以下代码中,“i”仅在 if-statement 中使用:
public void PrintStars(string s)
{
if (int.TryParse(s, out var i)) { WriteLine(new string('*', i)); }
else { WriteLine("Cloudy - no stars tonight!"); }
}
可以找到更多信息here。此链接不仅涉及输出参数,还包含 c#7.0
中引入的所有新功能答案 4 :(得分:1)
public void Ref_Test(ref int x)
{
var y = x; // ok
x = 10;
}
// x is treated as an unitialized variable
public void Out_Test(out int x)
{
var y = x; // not ok (will not compile)
}
public void Out_Test2(out int x)
{
x = 10;
var y = x; // ok because x is initialized in the line above
}