在通过引用获取参数的方法中“静态”的必要性

时间:2015-10-11 06:31:56

标签: c#

我在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发送这些变量的情况下该方法必须是静态的。

2 个答案:

答案 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(); } } 关键字与此无关。这就是你如何调用方法 - 通过对象引用或没有对象引用的静态方法。两者都不比另一个好。这是一个设计决定,每个都有不同的用途。