Maison > développement back-end > C++ > Pourquoi l'appel d'une méthode non statique à partir d'une méthode statique provoque-t-elle 'une référence d'objet est requise'?

Pourquoi l'appel d'une méthode non statique à partir d'une méthode statique provoque-t-elle 'une référence d'objet est requise'?

Susan Sarandon
Libérer: 2025-02-02 17:41:11
original
277 Les gens l'ont consulté

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

C # Erreur CS0120: référence d'objet requise

Cette erreur, "Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique ...", survient lorsque vous essayez d'accéder à un membre non statique (comme setTextboxText) à partir d'une méthode statique (SumData). Examinons le code fourni:

<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>
Copier après la connexion
Copier après la connexion

Le problème réside dans la différence fondamentale entre les membres statiques et non statiques:

  • Les membres statiques: appartiennent à la classe lui-même, pas à aucune instance spécifique de la classe. Ils existent avant même que tous les objets de la classe ne soient créés.
  • membres non statiques: appartiennent à instances de la classe. Vous avez besoin d'un objet (une instance) pour y accéder.

Puisque SumData est statique, il n'a pas d'objet Form1 associé. Par conséquent, il ne peut pas appeler directement setTextboxText, qui nécessite un objet pour fonctionner.

Solutions:

Il existe deux façons principales de résoudre ce problème:

1. Rendre setTextboxText statique:

Si setTextboxText n'a pas besoin d'accès intrinsèquement à des données spécifiques à l'instance ou aux membres de Form1, vous pouvez le rendre statique:

<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>
Copier après la connexion

ATTENTION: La création de méthodes liées à l'interface utilisateur est généralement découragée car elle peut entraîner des problèmes de filetage et rend le code plus difficile à maintenir.

2. Appelez setTextboxText à partir d'une méthode non statique (recommandée):

Il s'agit de la solution plus propre et plus courante. Vous aurez besoin d'une méthode non statique pour agir comme intermédiaire:

<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>
Copier après la connexion

Comment accéder à l'instance Form1 dans SumData (pour l'option 2):

La meilleure approche dépend de la façon dont SumData est invoqué. Voici quelques scénarios communs:

  • si SumData est appelé à partir d'une méthode de Form1: Vous pouvez utiliser directement this (comme indiqué dans l'exemple ci-dessus).

  • Si SumData est appelé à partir d'un thread de fond ou d'une minuterie: Vous devrez utiliser un délégué pour rassembler le rappel sur le fil d'interface utilisateur pour éviter les exceptions transversales:

<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>
Copier après la connexion
Copier après la connexion
  • Si SumData est appelé à partir d'une classe complètement distincte: Vous aurez besoin d'un moyen de transmettre une référence à l'instance Form1 à SumData. Cela pourrait impliquer de le passer comme un argument à SumData ou de stocker une référence à lui dans un champ statique (bien que cela soit généralement moins préféré en raison de complications potentielles).

N'oubliez pas de choisir la solution qui correspond le mieux au contexte de votre application et de prioriser la sécurité des threads lors de la gestion des éléments de l'interface utilisateur. L'option 2, en utilisant une méthode intermédiaire non statique et un filetage approprié, est généralement la solution la plus robuste et la plus maintenable.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal