Qu'est-ce qu'une «méthode statique» en C #?

177

Qu'est-ce que cela signifie lorsque vous ajoutez le mot-clé static à une méthode?

public static void doSomething(){
   //Well, do something!
}

Pouvez-vous ajouter le staticmot - clé à la classe? Que signifierait-il alors?

Moshe
la source
9
Vous pouvez utiliser la méthode statique sans créer une instance de cette classe simplement par class_name.static_method_name ();
Javed Akram
Au niveau de la programmation, nous avons le sentiment que nous sommes capables d'appeler une méthode statique sans créer une instance de classe / type. Ce n'est pas le cas en interne . CLR gère en interne une instance spéciale appelée instance de type pour gérer l'appel aux méthodes statiques. Veuillez voir cette réponse. C'est tellement intrigant.
RBT

Réponses:

313

Une staticfonction, contrairement à une fonction régulière ( instance ), n'est pas associée à une instance de la classe.

Une staticclasse est une classe qui ne peut contenir que des staticmembres et ne peut donc pas être instanciée.

Par exemple:

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}

Pour appeler InstanceMethod, vous avez besoin d'une instance de la classe:

SomeClass instance = new SomeClass();
instance.InstanceMethod();   //Fine
instance.StaticMethod();     //Won't compile

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine
SLaks
la source
28
C'est donc comme une méthode de classe au lieu d'une méthode d'instance?
Moshe
4
@Moshe: Exactement. Avec une méthode statique, vous n'avez pas besoin d'une instance de la classe pour appeler la méthode, juste la classe.
Binary Worrier
3
Mais existe-t-il en fait une sorte de limitation technique qui empêche d'appeler une méthode statique sur une instance? Si le compilateur le permet, quel est le danger qu'il soit accessible?
kroonwijk le
2
@kroon: Cela n'aurait aucun sens. Les méthodes d'instance prennent en fait simplement une instance comme premier paramètre caché. Les méthodes statiques ne le font pas. Voir mon article de blog: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks
Où "StaticMethod" est la méthode de classe et "InstanceMethod" est une méthode d'instance de classe SomeClass
Usman Younas
26

D'un autre point de vue: considérez que vous souhaitez apporter des modifications sur une seule chaîne. par exemple, vous voulez mettre les lettres en majuscules et ainsi de suite. vous créez une autre classe nommée "Tools" pour ces actions. il n'y a aucune signification de créer une instance de la classe "Tools" car il n'y a aucun type d'entité disponible à l'intérieur de cette classe (comparez à la classe "Person" ou "Teacher"). Nous utilisons donc un mot-clé statique pour utiliser la classe "Tools" sans en faire aucune instance, et lorsque vous appuyez sur le point après le nom de la classe ("Tools"), vous pouvez avoir accès aux méthodes que vous voulez.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Tools.ToUpperCase("Behnoud Sherafati"));
        Console.ReadKey();
    }
}

public static class Tools
{
    public static string ToUpperCase(string str)
    {
        return str.ToUpper();

    }
}
}
Behnoud Sherafati
la source
1
Utiliser «faire des modifications sur une chaîne» est un mauvais exemple - les chaînes sont immuables et ne peuvent pas être modifiées. Mais, sinon, l'explication a du sens (en remplaçant une classe non immuable par string)
Flydog57
13

Une méthode, un champ, une propriété ou un événement statique peut être appelé sur une classe même lorsqu'aucune instance de la classe n'a été créée. Si des instances de la classe sont créées, elles ne peuvent pas être utilisées pour accéder au membre statique. Une seule copie des champs et événements statiques existe, et les méthodes et propriétés statiques ne peuvent accéder qu'aux champs statiques et aux événements statiques. Les membres statiques sont souvent utilisés pour représenter des données ou des calculs qui ne changent pas en réponse à l'état de l'objet; par exemple, une bibliothèque mathématique peut contenir des méthodes statiques pour calculer le sinus et le cosinus. Les membres statiques de la classe sont déclarés à l'aide du mot-clé static avant le type de retour du membre

Alborz
la source
5

La fonction statique signifie qu'elle est associée à la classe (pas à une instance particulière de classe mais à la classe elle-même) et qu'elle peut être appelée même lorsqu'aucune instance de classe n'existe.

Classe statique signifie que la classe ne contient que des membres statiques.

mih
la source
5

En peu de temps, vous ne pouvez pas instancier la classe statique: Ex:

static class myStaticClass
{
    public static void someFunction()
    { /* */ }
}

Vous ne pouvez pas faire comme ça:

myStaticClass msc = new myStaticClass();  // it will cause an error

Vous ne pouvez faire que:

myStaticClass.someFunction();
r.mirzojonov
la source
0

Lorsque vous ajoutez un mot-clé "statique" à une méthode, cela signifie que l'implémentation sous-jacente donne le même résultat pour n'importe quelle instance de la classe. Inutile de dire que le résultat varie avec le changement de la valeur des paramètres

Balaji
la source
-1

La variable statique n'est pas liée à l'objet de la classe. Il est accessible en utilisant classname. Tous les objets de la classe partageront une variable statique.

En rendant la fonction statique, cela limitera l'accès de cette fonction dans ce fichier.

kapilddit
la source
-1

Noyau du mot-clé statique que vous n'aurez qu'une copie en RAM de cette (méthode / variable / classe) partagée pour tous les appels

Mahmoud
la source
-8

Le mot clé static, lorsqu'il est appliqué à une classe, indique au compilateur de créer une seule instance de cette classe. Il n'est alors pas possible de «créer» une ou plusieurs instances de la classe. Toutes les méthodes d'une classe statique doivent elles-mêmes être déclarées statiques.

Il est possible, et souvent souhaitable, d'avoir des méthodes statiques d'une classe non statique. Par exemple, une méthode de fabrique lors de la création d'une instance d'une autre classe est souvent déclarée statique car cela signifie qu'une instance particulière de la classe contenant la méthode factor n'est pas requise.

Pour une bonne explication sur comment, quand et où voir MSDN

Dave Arkley
la source
8
Non, une classe statique n'est jamais instanciée. Étant donné que tout est statique, pourquoi voudriez - vous envie de instancier?
Jon Skeet
1
Une staticclasse n'a aucune instance du tout.
SLaks
4
Désolé les gars, je ne comprends pas ... J'ai dit qu'une seule instance est créée et que vous ne pouvez pas en créer une nouvelle. Une seule instance statique est sûrement créée, sinon le code ne serait pas appelable?
Dave Arkley
2
Une classe statique a une instance, en fait deux, ce ne sont tout simplement pas des instances de theType. Une classe statique existera sur le tas en tant qu'objet [Foo] Type (table de recherche de méthode, etc. pour le JIT), et un objet System.Type spécial utilisé pour l'initialisation.
mccainz
Une classe peut être déclarée statique, indiquant qu'elle ne contient que des membres statiques. Il n'est pas possible de créer des instances d'une classe statique à l'aide du mot clé new. Les classes statiques sont chargées automatiquement par le Common Language Runtime (CLR) .NET Framework lorsque le programme ou l'espace de noms contenant la classe est chargé.
Satheesh