Je sais que des personnes ont déjà posé cette question auparavant, mais le scénario était trop spécifique et je suis confus quant aux principes fondamentaux.
J'ai deux versions de base d'un programme C #, une qui fonctionne et une qui ne fonctionne pas. J'adorerais que quelqu'un puisse expliquer pourquoi j'obtiens l'erreur Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique dans le deuxième programme.
Travaux:
namespace Experiments
{
class Test
{
public string myTest = "Gobbledigook";
public void Print()
{
Console.Write(myTest);
}
}
class Program
{
static void Main(string[] args)
{
Test newTest = new Test();
newTest.Print();
while (true)
;
}
}
}
Ne marche pas:
namespace Experiments
{
class Test
{
public string myTest = "Gobbledigook";
public void Print()
{
Console.Write(myTest);
}
}
class Program
{
public Test newTest = new Test();
static void Main(string[] args)
{
newTest.Print();
while (true)
;
}
}
}
Lorsque j'essaie de Imprimer () le texte de la classe Test () du second programme, cela me donne l'erreur une référence d'objet est requise pour le champ non statique, méthode, ou propriété}, et je ne comprends pas pourquoi. Je peux voir que cela a à voir avec le fait que je déclare une instance de la classe Test (), mais je ne me souviens de rien de pareil qui se passe en C++, alors cela me mystifie.
Que se passe-t-il?
Ce n'est pas à cause de la définition de la classe, il s'agit de l'utilisation du mot clé static
.
L'objet newTest
de la classe Test
est un membre public de la classe Program
et main
est une fonction statique de la classe de programme. et cela est clairement mentionné dans le message d'erreur An object reference is required for the non-static method
. Vous avez donc besoin de déclarer l'objet newTest
comme statique afin de pouvoir y accéder par des méthodes statiques telles que main.
comme ça
public static Test newTest = new Test();
Un Note complémentaire
Considérez que vous définissez la méthode Print
comme static
dans la classe Test
comme suit:
public static void Print()
{
Console.Write(myTest);
}
Ensuite, vous ne pouvez pas appeler la méthode comme celle que vous utilisez actuellement (newTest.Print();
). Au lieu de cela, vous devez utiliser Test.Print();
, depuis un membre statique ne peut pas être référencé via une instance. Il est référencé via le nom du type. Par exemple, considérons la classe suivante
Dans le premier programme, vous avez créé une nouvelle instance dans une méthode static . Dans cette méthode, il est possible de faire n'importe quoi.
Toutefois, lorsque vous souhaitez appeler des méthodes ou accéder à des variables en dehors de méthodes statiques, vous devez les rendre statiques. La raison en est que lorsque vous appelez une méthode statique, aucune instance de classe n'est créée et, par conséquent, aucune instance de variable non statique n'est encore créée et vous n'y avez pas accès!
Ainsi, dans le deuxième programme, la ligne d'initiation newTest variable n'est exécutée que lorsque vous avez une ligne de code en dehors de Program class comme Program p = new Program();
. La solution est de rendre la variable statique pour pouvoir y accéder en dehors de la méthode statique Print () , ou vous pouvez convertir votre méthode Min () en mode non statique, ce qui est impossible pour Main () méthode exceptionnellement.
Si vous souhaitez définir une variable globale, je vous suggère de définir une classe spéciale e.x. MyGlobals:
public class SomeClass
{
public int x;
}
public class MyGlobals
{
public static SomeClass mySharedVariable = new SomeClass();
public SomeClass myGlobalVariable = null;
}
// Usage:
class Program
{
static void Main(string[] args)
{
MyGlobals.mySharedVariable.x = 10; // Shared among all instances
MyGlobals myGlobal = new MyGlobals(); // New instance of MyGlobals
myGlobal.myGlobalVariable = new SomeClass(); // New instance of SomeClass
myGlobal.myGlobalVariable.x = 10; // One instance of MyGlobals including one instance of SomeClass
}
}