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>
Le problème réside dans la différence fondamentale entre les membres statiques et non statiques:
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>
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>
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>
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!