2016-01-27 4 views
2

Est-il possible en C# de créer une classe qui ne peut pas être copiée mais qui ne peut être transmise que par référence? L'équivalent en C++ consisterait à supprimer le constructeur de copie et l'opérateur d'affectation de copie enEst-il possible de créer un type non occlusable en C#

+6

Les classes sont transmises par référence. –

+2

Je ne pense pas que vous pouviez copier un objet à moins qu'il n'implémente l'interface 'ICloneable' – mikeyq6

+0

Alors que se passe-t-il si j'écris a = b en supposant que a et b sont des classes. Va-t-il seulement copier la référence ou va-t-il copier les valeurs des membres de b vers a? – Knitschi

Répondre

6

C'est le comportement par défaut. Si vous avez la classe:

class foo { 
    public string bar { get; set; } 
} 

et quelque part vous faites ceci:

foo f1 = new foo(); 
foo f2 = f1; 

Les deux f1 et f2 référencera même instance. Si, par exemple, vous définissez f1.bar = "bar", la valeur lue à partir de f2.bar sera "bar".

+0

Donc, je peux être sûr que le destructeur d'un objet de type classe n'est appelé qu'une seule fois, peu importe ce que je fais avec lui? – Knitschi

+1

@Knitschi - Les objets C# n'ont pas de destructeurs. La chose la plus proche est celle des finaliseurs, que la plupart des classes ne définissent pas non plus. – Lee

+0

Je vote ceci comme réponse, mais je tiens à souligner que vous pouvez copier des objets en utilisant la sérialisation, par ex. en utilisant Json.Net: 'foo f2 = JsonConvert.DeserializeObject (JsonConvert.SerializeObject (f1));' C'est clairement en dehors de la portée de la question; Je le mentionne simplement par curiosité. –

1

Vous pouvez créer un constructeur interne. De cette façon, le constructeur ne peut être appelé que depuis l'ensemble dans lequel il est défini.

Vous pouvez également créer une logique plus avancée en utilisant Reflection et StackTrace (par exemple) et en contrôlant en détail qui est autorisé à créer des instances de la classe, et quand. Une logique similaire peut être appliquée aux propriétés, où vous pouvez contrôler qui est autorisé à modifier les valeurs de propriété.

1

Il n'y a pas de destructeur en C#, seulement des Finalizers. Cependant, le GC est assez intelligent pour savoir quand il n'y a plus de références pour un objet donné et qu'il appelle ce finaliseur. Ainsi, lorsque deux variables font référence au même objet, cet objet demeure tant que ces deux références existent. Si les deux (!!) sont hors de portée, le GC collecte l'objet à supprimer.