Heim > Backend-Entwicklung > C++ > Warum verursacht das Aufrufen einer nicht statischen Methode aus einer statischen Methode 'Eine Objektreferenz ist erforderlich'?

Warum verursacht das Aufrufen einer nicht statischen Methode aus einer statischen Methode 'Eine Objektreferenz ist erforderlich'?

Susan Sarandon
Freigeben: 2025-02-02 17:41:11
Original
279 Leute haben es durchsucht

Why Does Calling a Non-Static Method from a Static Method Cause

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>
Nach dem Login kopieren
Nach dem Login kopieren
Das Problem liegt im grundlegenden Unterschied zwischen statischen und nicht statischen Mitgliedern:

  • statische Mitglieder: gehören zur -Klasse selbst, nicht zu einer spezifischen Instanz der Klasse. Sie existieren noch, bevor Objekte der Klasse erstellt werden.
  • Nichtstatische Mitglieder: gehören zu Instanzen der Klasse. Sie benötigen ein Objekt (eine Instanz), um darauf zuzugreifen.
Da

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

Wenn

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren
  • Wenn 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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage