簡體   English   中英

公共實例變量訪問錯誤:“非靜態字段,方法或屬性需要對象引用......”

[英]Public instance variable access error: “An object reference is required for the non-static field, method, or property…”

決議:Dev Env問題。 重新啟動Dev Env,一切正常。

第一次詢問,所以如果我做錯了,請告訴我。

我正試圖在C#中使用特定於實例的變量。 以下測試代碼似乎應該可以工作,但會拋出錯誤:

非靜態字段,方法或屬性需要對象引用...

這樣做的正確方法是什么,以便我有一個對於每個類的實例都是唯一的公共var,並且可以在函數中設置var(靜態或其他)?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AlchemyWebSocketsTest2
{
    class KHandler
    {
        public string name = "wut";
        static void KHandlerInstantiate()
        {
            name = "huh";
            Console.WriteLine("All Good.");
        }

    }
}

您需要一個KHandler實例。 請注意handler對象,它是KHandler類的一個實例。

namespace AlchemyWebSocketsTest2
{
   class KHandler
   {
     public string name = "wut";
     static void Main()
     {
        KHandler handler = new KHandler();
        handler.name = "huh";
        Console.WriteLine("All Good.");
     }

  }
}

您正在嘗試訪問靜態函數內的非靜態成員。 如果將name聲明為public static string name = "wut"; ,那么你的代碼應該編譯。 我建議看看靜態類和方法

您正在嘗試在靜態(類型)方法中分配非靜態(實例)成員。 要指定名稱,您必須創建他的KHandler類的實例

static void Main()
{
     var khandlerInstance = new KHandler();
     khandlerInstance.name = "huh";
     Console.WriteLine("All Good.");
}

UPD。 如果需要通過靜態方法為每個實例分配變量,則必須將實例作為參數傳遞。

class KHandler
{
    string Name;
    public static void ChangeName(KHandler targetInstance, string newName)
    {
        targetInstance.Name = newName;
    }
}

好吧,一些構造函數怎么樣?

// a sample base class
class KBase  {
     public readonly int value;  // making it readonly means it can only be assigned to once, and that has to happen during a constructor.
     public KBase ( int startValue ) { value = startValue; }
}

class KHandler : KBase
{
    public readonly string name = "wut";

    // this is a parameterless constructor, whose implementation invokes another constructor ( the one below ) of this class
    public KHandler () : this ( "huh" ) {
    }

    // this is a 1 parameter constructor, whose implementation ensures KBase is properly initialized, and then proceeds to initialize its part of the new instance.
    public KHandler ( string val ) : base ( 3 ) { 
        name = val;
    }
}

class Test {
    static void Main()
    {
        // this next line calls the parameterless constructor I defined above
        KHandler handler = new KHandler();  

        // and this next line calls the 1 parameter constructor
        KHandler handler2 = new KHandler("something else");

        Console.WriteLine("All Good 1"+handler.name);
        Console.WriteLine("All Good 2"+handler2.name);
    }
}

我想你想要構造函數的基本機制,它們在新的類實例被分配並“歸零”之后在稍微特殊的環境中運行。 特殊環境是編譯器/語言確保正確初始化所有基類和字段,並且允許在構造期間(僅)分配給只讀成員。

構造函數可以調用基類構造函數來正確初始化這些基礎; 構造函數也可以在繼續之前調用同一個類的另一個構造函數。

每個類可以有多個構造函數 - 就像我上面的例子一樣。 如果未指定構造函數,則編譯器會為您有效地插入空白無參數構造函數。 如果您不想要這種行為,那么添加您自己的構造函數(任何參數列表)將取消編譯器/語言自動創建空白無參數構造函數。 (如果你添加了自己的參數化構造函數並且仍然想要無參數構造函數,則必須自己添加它。)

第一個構造函數(無參數構造函數)作為第一個新KHandler()的結果被調用,第二個構造函數被第二個新的KHandler(字符串)調用。

構建后,一個對象被認為可以使用了。 無論如何,搜索構造函數的一般構造,你會得到更多的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM