![](/img/trans.png)
[英]Error: An object reference is required for the non-static field, method, or property
[英]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.