繁体   English   中英

非静态字段,方法或属性DoStuff(int,int)'需要对象引用

[英]An object reference is required for the non-static field, method, or property DoStuff(int, int)'

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int number1,number2;
            number1 = int.Parse(Console.ReadLine());
            number2 = int.Parse(Console.ReadLine());
            Console.WriteLine("the sum of numbers are " +" "+ (number1 + number2));
            Console.ReadKey();
            DoStuff(number1,number2);
        }

        public int DoStuff(int num1,int num2)
        {
            int result = num1 + num2;
            return result;
        }

    }
}

我究竟做错了什么?

不允许在静态方法内调用非静态方法。 如果要调用,则需要一个对象引用。 这是因为静态方法无法实例化。 因此,方法DoStuff应该是静态的,因此其签名可能如下所示:

public static int DoStuff(int num1,int num2)
{
    int result = num1 + num2;
    return result;
} 

我还有另一条建议,建议您改善程式码; 它只是使用int.TryParse代替简单的.Parse 这也可以帮助您处理FormatException。 因此完整的代码如下所示:

class Program
{
    static void Main(string[] args)
    {
        int number1, number2;
        if (int.TryParse(Console.ReadLine(), out number1) && int.TryParse(Console.ReadLine(), out number2))
        {
            Console.WriteLine("the sum of numbers are :{0}", DoStuff(number1, number2));
        }
        else
            Console.ReadKey();
    }
    public static int DoStuff(int num1, int num2)
    {
        int result = num1 + num2;
        return result;
    }

}

在静态函数中,您只能调用静态函数。 因此,将DoStuff函数更改为静态函数:

public static int DoStuff(int num1,int num2)
{
    int result = num1 + num2;
    return result;
}

有关更多信息: 静态类

非静态成员属于实例。 如果不以某种方式解决您正在谈论的类的实例,这是毫无意义的。 在静态上下文中,您没有实例,这就是为什么如果不显式提及对象引用就无法访问非静态成员的原因。

实际上, 可以通过显式指定对象引用来在静态上下文中访问非静态成员:

class HelloWorld {
   int i;
   public HelloWorld(int i) { this.i = i; }
   public static void Print(HelloWorld instance) {
      Console.WriteLine(instance.i);
   }
}

var test = new HelloWorld(1);
var test2 = new HelloWorld(2);
HelloWorld.Print(test);

在不显式引用Print方法中的实例的情况下,它将如何知道应打印1而不是2?

您正在使用DoStuff作为静态方法。

您应该执行以下操作:

...
Console.ReadKey();
var program = new Program();
program.DoStuff(number1, number2);
...

因此,创建您的类的实例并在其上调用方法。

如果确实要以静态方式使用该方法,则应静态声明它:

public static int DoStuff(int num1,int num2)
{
    int result = num1 + num2;
    return result;
} 

请参阅“公共”之后的“静态”关键字。

从C#规范:

1.6.6.3静态方法和实例方法

用static修饰符声明的方法是静态方法。 静态方法不会在特定实例上运行,只能直接访问静态成员。 没有静态修饰符声明的方法是实例方法。 实例方法在特定实例上运行,并且可以访问静态成员和实例成员。 这样可以显式访问在其上调用了实例方法的实例。 在静态方法中引用它是错误的。

您的Main方法是静态的,因此它只能访问静态成员。 解决方案是更改:

public static int DoStuff(int num1,int num2)

您可以使用如下所示的静态方法填充方法,或者

public static  int DoStuff(int num1,int num2)
 {
    int result = num1 + num2;
    return result;
 }

静态方法 :使用类型名称调用这些方法 不需要实例,这使它们速度稍快。 静态方法可以是公共的或私有的。

信息:静态方法使用static关键字,通常用作public之后的第一个关键字或第二个关键字。 警告:静态方法无法访问非静态类级别的成员。 它没有“ this”指针。

实例:实例方法可以访问那些成员,但是必须通过实例化的对象进行调用。 这增加了间接性。

例如

class Program
   {
    static void MethodA()
    {
        Console.WriteLine("Static method");
    }

    void MethodB()
    {
        Console.WriteLine("Instance method");
    }

    static char MethodC()
    {
        Console.WriteLine("Static method");
        return 'C';
    }

    char MethodD()
    {
        Console.WriteLine("Instance method");
        return 'D';
    }

    static void Main()
    {
        //
        // Call the two static methods on the Program type.
        //
        Program.MethodA();
        Console.WriteLine(Program.MethodC());
        //
        // Create a new Program instance and call the two instance methods.
        //
        Program programInstance = new Program();
        programInstance.MethodB();
        Console.WriteLine(programInstance.MethodD());
        Console.ReadLine();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM