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

本文关键字:int 对象引用 字段 静态 方法 DoStuff 属性 | 更新日期: 2023-09-27 17:52:17

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(int, int)'需要对象引用

不允许在静态方法中调用非静态方法。如果要调用,则需要对象引用。这是因为静态方法不能被实例化。因此,方法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作为静态方法。

你应该这样做:

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

所以创建一个类的实例并调用它的方法。

如果你想以静态方式使用该方法,你应该静态地声明它:

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

参见"public"后面的"static"关键字

来自c#规范:

1.6.6.3静态方法和实例方法

用静态修饰符声明的方法是静态方法。静态方法不对对象进行操作只能直接访问静态成员。一个未声明静态修饰符的方法是实例方法。一个方法在特定实例上操作,并且可以访问这两个实例静态成员和实例成员。实例方法所作用的实例被调用的对象可以显式地访问。……是错误的在静态方法中引用它。

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

public static int DoStuff(int num1,int num2)

从静态函数中只能调用静态函数。因此,将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呢?

可以像下面这样用static填充方法,或者

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();
    }
}