Bonjour à tous.
Issu du monde C++ j'ai l'habitude de faire des accesseurs get qui retournent une référence constante et des accesseurs set qui prent comme paramètre une référence constante.
De sorte que le get permet d'acceder directement à un objet avec une sémantique de valeur sans création d'objet temporaire (puisque le const protège contre les modifications à l'exterieur de la classe).
Et de sorte que le set permet d'assigner la valeur reçue sans création, là non plus, d'objet temporaire, éventuellement avec la surcharge de l'opérateur= de la classe de l'objet à assigner.
Mais en c# pas de const et pas de surcharge de l'opérateur=. La solution me semble de faire comme ce qui suit:
Mais l'accesseur get créé un objet de classe Data dont la durée de vie est très temporaire. Et l'accesseur set crée un objet de classe Data qui remplace le lUser.mData précédent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 namespace csq001 { // Classe à sémantique de valeur. // (pas pas une Struct !! sinon le problème ne se pose plus) class Data { public Data() {} public Data(int aValue) { mValue = aValue; } public Data(Data aData) { mValue = aData.mValue; } private int mValue = 0; } // Class qui presente une valeur (set) class Presenter { public Presenter(int aValue) { mData = new Data(aValue); } public Data Value { // Accesseur // Création d'une copie pour protéger // l'attribut privé. get { return new Data(mData); } } private Data mData; } // Classe a qui on fournit une valeur (get) class User { public Data Value { // Accesseur // Création d'un copie pour protéger // le fournisseur et remplacer l'ancienne instance par la nouvelle. set { mData = new Data(value); } } private Data mData = new Data(); } class Program { static void Main(string[] args) { Presenter lPresenter = new Presenter(27); User lUser = new User(); // A ce point // lPresenter.mData.mValue vaut 27 // lUser.mData.mValue vaut 0 lUser.Value = lPresenter.Value; // A ce point // lPresenter.mData.mValue vaut 27 // lUser.mData.mValue vaut 27 // C'est ce qui est voulu. } } }
Bilan 2 duplications d'objet et 2 objets à traiter par le garbage collector, ce que je n'aurai jamais écrit en C++.
Comment faire mieux ? Est-ce nécessaire de faire mieux ? Comment gère t'on cette problématique récurrente en C# (J'imagine qu'il y a le même problème en Java) ?
Merci d'avance.
Partager