web-dev-qa-db-fra.com

Quel est l'intérêt d'une méthode statique dans une classe non statique?

J'ai du mal à comprendre les erreurs sous-jacentes avec le code ci-dessous:

class myClass
{
    public void print(string mess)
    {
        Console.WriteLine(mess);
    }
}

class myOtherClass
{
    public static void print(string mess)
    {
        Console.WriteLine(mess);
    }
}

public static class Test
{
    public static void Main()
    {
        myClass mc = new myClass();
        mc.print("hello");

        myOtherClass moc = new myOtherClass();
        moc.print("vhhhat?"); 
       //This says I can't access static method in non static context, but am I not?

    }
}

Je ne peux jamais penser à une raison pour laquelle on déclarerait une méthode statique dans une classe non statique, alors pourquoi .NET ne lèvera-t-il pas une erreur d'exception.

En outre,

moc.print("vhhhat?");

Cela dira que je ne peux pas accéder à la méthode statique dans un contexte non statique mais que Test et main sont statiques, à quoi fait-il référence?

30
Matt

Une classe statique signifie que vous ne pouvez pas l'utiliser dans un contexte non statique, ce qui signifie que vous ne pouvez pas avoir d'instanciation d'objet de cette classe et appeler la méthode. Si vous vouliez utiliser votre méthode d'impression, vous devrez faire:

myOtherClass.print("vhhhat?");

Ce n'est pas statique, car vous avez créé une instanciation de la classe appelée moc:

myOtherClass moc = new myOtherClass();
22
AlbertoPL

Cela dira que je ne peux pas accéder à la méthode statique dans un contexte non statique mais que Test et main sont statiques, à quoi fait-il référence?

Cela fait référence au fait que vous faites référence à une méthode statique (myOtherClass.print) à l'aide d'une instance (moc). Vous auriez à retravailler ceci pour être:

myOtherClass.print("vhhhat?");

Cela compilera correctement.

Les méthodes statiques sont des méthodes qui fonctionnent sur la classe elle-même, et non sur une instance spécifique de la classe. Cela a de nombreuses utilisations - un exemple est pour implémenter le modèle de méthode d'usine .

12
Reed Copsey

Tout d'abord, l'erreur:

moc.print("vhhhat?");

Essaie d'appeler une méthode statique sur une instance de la classe (c'est-à-dire un contexte non statique). Pour appeler correctement print (), vous feriez

myOtherClass.print("vhhhat?");

Pour la première question, il existe de nombreuses raisons d'avoir des méthodes statiques dans une classe non statique. Fondamentalement, s'il y a une opération associée à la classe, mais pas à une instance particulière de la classe, il doit s'agir d'une méthode statique. Par exemple, String.Format () (ou l'une des méthodes statiques String) ne doit pas fonctionner sur des instances de chaîne, mais elles doivent être associées à la classe String. Par conséquent, ils sont statiques.

11
Sean

Parfois, l '"objectif" de la fonction est propre à la classe plutôt qu'à l'objet (instance de la classe).

Par exemple, une méthode d'usine:

SomeClass obj = SomeClass.CreateInstance();

Ceci est plus apparent lorsque le langage a des fonctionnalités de métaprogrammation qui permettent des opérations sur les classes. En Python, cette distinction est rendue plus explicite par convention: le premier paramètre passé à une fonction est soit nommé quelque chose comme "cls" ou "self" et indique que la fonction pourrait opérer sur la classe (quand c'est une "méthode de classe") ou l'instance (le type auquel vous êtes le plus habitué, lorsqu'il s'agit d'une méthode d'instance).

3
ars

Le programme correct serait: -

class myClass
{
    public void print(string mess)
    {
        Console.WriteLine(mess);
    }
}

class myOtherClass
{
    public static void print(string mess)
    {
        Console.WriteLine(mess);
    }
    public void printMe(string mess)
    {
        Console.WriteLine(mess);
    }
}

public static class Test
{
    public static void Main()
    {
        myClass mc = new myClass();
        mc.print("hello");

        myOtherClass moc = new myOtherClass();
        myOtherClass.print("vhhhat?");
        moc.printMe("test me");


    }
}
1
Shruti Sehgal

Voici un bon exemple d'utilisation de méthodes statiques dans une classe non statique:

ASP.NET AJAX rappels aux méthodes Web dans les pages ASPX

1
Adam Prescott

Lorsque vous appelez une méthode sur un instance d'objet, vous l'appelez dans un contexte non statique. La méthode utilisée pour cela n'a aucune importance.

0
EFraim