c# readonly objet
Est-il un moyen pour revenir en lecture-seule instance d'un objet?
public class Person
{
public String FirstName { get; set; }
public String LastName { get; set; }
}
public class SomeClass
{
public SomeClass(Person manager)
{
if (manager == null)
throw new ArgumentNullException("manager");
_manager = manager;
}
private readonly Person _manager;
public Person Manager
{
get { return _manager; } //How do I make it readonly period!
}
}
Est la seule façon de le faire en retournant un Clone() de sorte que toutes les modifications sont faites à la copie et non l'original? Je sais que pour les Tableaux il y a une fonction pour retourner un Tableau en lecture seule. Oh, et je sais que c'est un type de référence... je suis d'ailleurs vous vous demandez si il y a un peu caché C# fonction pour verrouiller l'écriture de la partie.
J'ai été essayer de venir avec un Générique En lecture seule classe wrapper, mais je ne pouvais pas comprendre comment obtenir les propriétés en lecture seule sans faire certains cher la réflexion et le tel.
Oh, et je suis vraiment essayer d'éviter de créer une deuxième version de la classe qui est de toutes les propriétés en lecture seule. À ce point, je pourrais tout aussi bien retourner le clone.
- Sur la base des commentaires: il y a connu "En lecture seule" classe wrapper générique est rapide et efficace? Celui que j'ai essayé de faire avait à utiliser la réflexion, ce qui n'est pas vraiment ce que je veux faire, si je peux l'éviter.
Vous devez vous connecter pour publier un commentaire.
Pour vous sauver de la création d'une classe supplémentaire, vous pouvez le faire mettre en œuvre comme d'une interface IPerson qui n'a que des propriétés en lecture seulement.
Person
a aucun problème, je recommande ce trop) ... mais comment est-ce épargner aucun effort contre la création d'une classe?Person iCanChangeProperties = (Person)SomeClass.Manager;
Et le Casting n'est pas de s'en protéger à l'aide de cette référence à apporter des modifications aux propriétés... je pourrais juste avoir à coller à cloner. Cependant, la lecture seule interface serait bien si la réflexion leur dit qu'ils ne PEUT PAS ne setter propriétés.Vous pouvez transformer la classe Personne dans un objet immuable, comme ci-dessous..
Vous pouvez congeler objet (il est immuable), dans certaines conditions, avec l'aide de
Castle.DynamicProxy
. Lire ce blog post pour plus de détails.Il n'y a pas une telle fonctionnalité que vous avez couvert vos options.
Soit cloner ou faire une lecture seule
Person
type. La dernière approche est généralement préférée parce que les règles sont claires: c'est évident pour les appelants qu'ils ne devraient pas (et ne peut pas) modifier l'instance.String
/StringBuilder
etUri
/UriBuilder
. Il n'a de sens que lors de la lecture d'utilisation est de loin plus nombreux, ce qui est le cas pour ces deux.Ici un autre exemple, en fonction de la Liste.AsReadOnly est mis en œuvre dans le .NET Framework 2.0. Un booléen (IsReadOnly) est utilisé dans les méthodes appropriées pour empêcher la mise à jour:
Pour le tester :
Il n'y a pas une façon de faire toutes les propriétés de votre objet en lecture seule de l'extérieur de la classe. Dans l'exemple ci-dessus, vous ne pouvez pas faire la _manager propriétés en lecture seule, sauf si vous avez modifié les propriétés au sein de la classe Personne à être en lecture seule.
Vous pouvez faire le poseur de propriétés de la classe Personne interne, ce qui signifie que seules les classes au sein de la même assemblée que Personne peut changer les propriétés.
Ou, si vous faites le setter de la propriétés privées, alors seul le code à l'intérieur de la Personne peut modifier les valeurs des propriétés.
Pas. Vous êtes à la recherche de quelque chose comme C++-style
const
-ness, et pour divers raisons C# n'a pas que.Cependant, les types anonymes sont vraiment immuable.
Objets anonymes sont en lecture seule.