我在C#中编程大约2个月,我一直注意到这样一个事实:方法通过引用获取参数的唯一方法是当方法设置为静态方法时,我不明白这种情况背后的原因。例如,在C ++中,我们可以通过引用我们想要的任何方法来发送参数。
非常感谢:)
我为那些要求的人添加了一个非常简单的代码:
public void f(ref int num)
{
num++;
}
private static void Main(string[] args)
{
int a = 0;
f(ref a);
Console.WriteLine(a);
Console.Read();
}
我得到的错误:
An object reference is required for the non-static field, method, or property
现在,我知道在C#中几乎所有不是int,string,double ......和其他内置变量的都是由ref自动发送的。我想知道为什么在通过ref发送这些变量的情况下该方法必须是静态的。
答案 0 :(得分:1)
方法通过引用获取参数的唯一方法是当方法设置为静态方法时
那是不对的。 C#有一个Reference Types and Value Types的概念,其中两者都是按值传递的,但该值不同。对于引用类型,传递的值是引用本身,对于值类型,它是值的副本。
如果您想通过引用获取值类型,可以使用方法签名中的ref
修饰符:
public void M(ref int x)
对于引用类型也是如此,只是因为通过ref
传递它们将传递指向数据结构的当前引用,并且不会创建该引用的副本。
答案 1 :(得分:1)
您无法使用f
,因为它是一个实例方法而Main
是静态方法,因此如果没有包含{{1}的类的实例,则无法从此处调用它(我猜f
)。
您需要创建Program
的实例:
这与错误消息所说的相同:
非静态字段,方法或属性
需要对象引用
所以你创建了对Program
的对象引用:
Program
或使方法静态以便能够使用它:
class Program
{
public void f(ref int num)
{
num++;
}
private static void Main(string[] args)
{
int a = 0;
var p = new Program();
p.f(ref a);
Console.WriteLine(a);
Console.Read();
}
}
class Program
{
public static void f(ref int num)
{
num++;
}
private static void Main(string[] args)
{
int a = 0;
f(ref a); // is the same as: Program.f(ref a)
Console.WriteLine(a);
Console.Read();
}
}
关键字与此无关。这就是你如何调用方法 - 通过对象引用或没有对象引用的静态方法。两者都不比另一个好。这是一个设计决定,每个都有不同的用途。