簡體   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