Je pense que vous êtes prête à confusion avec des classes où la vit avec mémoire comment la mémoire est maintenue sur. Lorsque vous créez une instance d'une classe normale, la mémoire de cette instance reste sur le tas. Une référence à cette instance peut se trouver dans un objet sur le tas (si vous définissez une variable membre dans une instance différente d'un objet); ou une variable de pile (si vous avez déclaré une variable à l'objet dans une méthode ou l'avez passée à un appel de fonction), ou elle peut être dans la liste des racines globales (s'il s'agit d'une référence statique, par exemple une référence Singleton).
Une classe statique ne peut pas être instanciée. Il n'y a pas de "référence" à la classe n'importe où (sauf pour les informations de type). Ses méthodes ne sont que des fonctions chargées en mémoire lorsque le CLR charge l'assemblage. Vous pouvez créer un délégué qui pointe vers l'une de ces méthodes, mais cela ne fait pas non plus référence à une instance de la classe. C'est juste un pointeur sur une fonction.
Par exemple, regardez ce code:
class ObjectWrapper
{
Object obj = new Object();
}
static void Main(string[] args)
{
ObjectWrapper wrapper = new ObjectWrapper();
...
}
La principale méthode crée une instance d'une classe ObjectWrapper. Cette instance vit sur le tas.
À l'intérieur de l'instance ObjectWrapper, il existe une instance de classe Object qui réside sur le tas. La référence à cette classe est à l'intérieur de l'instance, donc je suppose que vous pourriez penser à la référence comme "vivant dans le tas".
Maintenant, comparez cela le code suivant:
class Singleton
{
static readonly instance = new Singleton();
}
L'instance de l'objet Singleton vit sur le tas, aussi. Cependant, la référence est une référence statique. Il est maintenu par le CLR dans une liste de références globales ou "root".
Regardez maintenant cette classe statique:
class ObjectWrapper
{
Object obj = new Object();
}
static class HelperMethods
{
static int DoSomethingUseful(ObjectWrapper wrapper1)
{
ObjectWraper wrapper2 = wrapper1;
// code here
}
}
HelperMethods est une classe statique. Vous ne pouvez pas instancier la classe HelperMethods. Il ne peut y avoir aucun objet de cette classe sur le tas. Toutefois, dans la méthode DoSomethingUseful, il a deux références à une instance de la classe ObjectWrapper sur la pile. Un est passé, et un est déclaré à l'intérieur de la méthode.
Je ne comprends pas une partie de cette question. Qu'entendez-vous par "sa valeur" et "son ref"? –
Je pense qu'il parle de la façon dont il sépare le code exécutable des membres de données. –
Parmi d'autres questions, c'est "son". – jason