C# Fehler CS0120: Objektreferenz erforderlich
Dieser Fehler "Eine Objektreferenz ist für das nichtstatische Feld, die Methode oder die Eigenschaft erforderlich ..." entsteht beim Versuch, aus einer statischen Methode (setTextboxText
). Untersuchen wir den bereitgestellten Code: SumData
<code class="language-csharp">namespace WindowsApplication1 { public partial class Form1 : Form { // ... other code ... private static void SumData(object state) { // ... some code to calculate 'result' ... setTextboxText(result); // Error occurs here } // ... other code ... including setTextboxText method ... } }</code>
statisch ist, hat es kein zugehöriges SumData
-Objekt. Daher kann es nicht direkt Form1
aufrufen, wodurch ein Objekt erforderlich ist. setTextboxText
Lösungen:
Es gibt zwei primäre Möglichkeiten, dies zu beheben:
1. Machen Sie statisch: setTextboxText
keinen Zugriff auf instanzspezifische Daten oder Mitglieder von setTextboxText
benötigt, können Sie es statisch machen: Form1
<code class="language-csharp">public static void setTextboxText(int result) { // Code to update the textbox. This might require accessing the textbox // statically (e.g., if it's a public static member of Form1). This is often // not ideal for UI elements. }</code>
Vorsicht: Machen Sie ui-bezogene Methoden statisch, da dies zu Problemen mit Threading führen kann und den Code schwieriger macht. .
2. Rufen Sie setTextboxText
von einer nicht statischen Methode auf (empfohlen):
Dies ist die sauberere und häufigere Lösung. Sie benötigen eine nicht statische Methode, um als Vermittler zu fungieren:
<code class="language-csharp">private void UpdateTextbox(int result) { setTextboxText(result); // This is now safe } private static void SumData(object state) { // ... calculate 'result' ... // Access the Form1 instance using a delegate or other mechanism // (see examples below) this.BeginInvoke(new Action(() => UpdateTextbox(result))); //Example using BeginInvoke for UI thread safety }</code>
So greifen Sie auf die Form1
-Instanz in SumData
(für Option 2):
Der beste Ansatz hängt davon ab, wie SumData
aufgerufen wird. Hier sind einige gemeinsame Szenarien:
Wenn SumData
innerhalb einer Methode von Form1
: aufgerufen werden, können Sie this
direkt verwenden (wie im obigen Beispiel gezeigt).
Wenn SumData
aus einem Hintergrund-Thread oder Timer aufgerufen wird: Sie müssen einen Delegierten verwenden, um den Rückruf zum UI-Thread zu marschieren, um Ausnahmen von Querverkleidungen zu vermeiden:
<code class="language-csharp">namespace WindowsApplication1 { public partial class Form1 : Form { // ... other code ... private static void SumData(object state) { // ... some code to calculate 'result' ... setTextboxText(result); // Error occurs here } // ... other code ... including setTextboxText method ... } }</code>
SumData
aus einer vollständig separaten Klasse aufgerufen wird: Sie benötigen eine Möglichkeit, einen Verweis auf die Form1
-Schunierung an SumData
zu übergeben. Dies könnte dazu beinhalten, es als Argument für SumData
zu übergeben oder einen Verweis in einem statischen Feld zu speichern (obwohl dies aufgrund potenzieller Komplikationen im Allgemeinen weniger bevorzugt wird). Denken Sie daran, die Lösung auszuwählen, die am besten in den Kontext Ihrer Anwendung passt, und priorisieren Sie immer die Sicherheit der Threads, wenn Sie mit UI -Elementen umgehen. Option 2 ist mit einer nicht statischen Zwischenmethode und einer ordnungsgemäßen Gewinde die robusteste und wartbarste Lösung.
Das obige ist der detaillierte Inhalt vonWarum verursacht das Aufrufen einer nicht statischen Methode aus einer statischen Methode 'Eine Objektreferenz ist erforderlich'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!