2010-01-21 4 views
2

Compte tenu de cette classe ...compilateur mises en œuvre dans immutabilité .Net

public class Test 
{ 
    private long _id; 

    public Test(long id) 
    { 
    _id = id; 
    } 
} 

Est-ce que le compilateur .Net compiler en fait comme ...

public class Test 
{ 
    private readonly long _id; 

    public Test(long id) 
    { 
    _id = id; 
    } 
} 

En d'autres termes, faut-il comprendre que _id est uniquement défini à partir du constructeur et est, par conséquent, en lecture seule?

Répondre

4

Non, le compilateur ne le fait pas. Le code IL pour le champ sera comme ceci:

.field private int64 _id 

... tandis qu'une version en lecture seule obtiendrait ce code IL:

.field private initonly int64 _id 
2

Le compilateur ne peut pas savoir peut-être qu'un champ est uniquement le constructeur. Imaginez par exemple l'utilisation de la réflexion dans une méthode où le nom du champ est lu à partir d'une base de données. Vous devez spécifier explicitement le mot-clé readonly si vous voulez que le champ soit immuable.

+0

Ceci est légèrement trompeur et ne répond pas vraiment à la question. Considérez la situation "opposée" où vous avez un champ 'readonly' privé: Le compilateur * sait * si vous essayez de définir ce champ de n'importe où sauf la déclaration/constructeur, mais il n'y a rien pour vous empêcher de le définir ailleurs en utilisant la réflexion . Si le compilateur peut valider l'utilisation des champs 'private readonly', il n'y a pas de raison (théorique) de ne pas vérifier l'utilisation des champs non-' readeadly'. – LukeH

Questions connexes