Si ce sujet vous intéresse, j'ai un certain nombre d'articles sur la programmation immuable à http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
J'étais juste curieux de savoir pourquoi les structures, les chaînes, etc. sont-ils immuables?
Les structures et les classes ne sont pas immuables par défaut, mais il est conseillé d'effectuer les structures immuables. J'aime immuable classes de trop.
Les chaînes sont immuables.
Quelle est la raison de leur immuable et le reste des objets mutables.
Raisons de faire tous les types immuables:
Il est plus facile de raisonner sur des objets qui ne change pas. Si j'ai une file d'attente avec trois éléments en elle, je sais qu'il n'est pas vide, il n'était pas vide il ya cinq minutes, il ne sera pas vide dans l'avenir. Il est immuable! Une fois que je connais un fait, à ce sujet, je peux utiliser ce fait pour toujours. Faits sur des objets immuables ne pas aller rassis.
Un cas particulier du premier point: des objets immuables sont beaucoup plus facile de faire des threads. La plupart la sécurité des threads problèmes sont dus à l'écrit sur un fil et on lit sur l'autre; des objets immuables n'avez pas écrit.
Des objets immuables peuvent être démontés et réutilisés. Par exemple, si vous avez un immuable arbre binaire vous pouvez utiliser sa gauche et à droite de sous-arborescences que les sous-arbres de différentes arbre sans vous en soucier. Dans une mutable structure, vous finissent généralement par faire des copies de données pour la ré-utiliser parce que vous ne voulez pas les changements apportés à une logique de l'objet en affecter un autre. Cela peut vous faire économiser beaucoup de temps et de mémoire.
Des raisons pour lesquelles les structures immuables
Il y a beaucoup de raisons pour faire des structures immuables. Voici juste un.
Les structures sont copiés par valeur et non par référence. Il est facile de par inadvertance traiter une structure comme étant copiés par référence. Par exemple:
void M()
{
S s = whatever;
... lots of code ...
s.Mutate();
... lots more code ...
Console.WriteLine(s.Foo);
...
}
Maintenant, vous voulez revoir certaines de ce code dans une méthode d'aide:
void Helper(S s)
{
... lots of code ...
s.Mutate();
... lots more code ...
}
FAUX! Qui devrait être (ref S) -- si vous ne le faites pas alors la mutation qui va se passer sur une copie de la s. Si vous ne laissez pas les mutations en premier lieu, puis toutes ces sortes de problèmes disparaissent.
Raisons pour faire de chaînes immuable
Souvenir de mon premier point sur les faits au sujet de immuable structures de rester dans les faits?
Supposons que les cordes étaient mutable:
public static File OpenFile(string filename)
{
if (!HasPermission(filename)) throw new SecurityException();
return InternalOpenFile(filename);
}
Que faire si l'hostilité de l'appelant mute nom du fichier après le contrôle de sécurité et avant que le fichier est ouvert? Le code vient d'ouvrir un fichier qu'ils pourraient ne pas avoir l'autorisation de!
Encore une fois, de données mutable est difficile de raisonner sur. Vous voulez que le fait "le présent de l'appelant est autorisé à voir le fichier décrit par cette chaîne" pour être vrai pour toujours, pas jusqu'à ce qu'une mutation se produit. Avec les cordes mutables, d'écrire du code sécurisé nous avions constamment à faire des copies de données que nous savons ne pas changer.
Quelles sont les choses qui sont envisagées pour rendre un objet immuable?
Le type logiquement représenter quelque chose qui est "éternelle" de la valeur? Le nombre 12 est le nombre de 12; elle ne change pas. Entiers doivent être immuables. Le point (10, 30) est le point (10, 30); elle ne change pas. Les Points devraient être immuable. La chaîne "abc" est la chaîne "abc"; elle ne change pas. Les chaînes doivent être immuable. La liste (10, 20, 30) ne change pas. Et ainsi de suite.
Parfois, le type représente des choses qui changent. Mary Smith, du nom est Smith, mais demain, elle pourrait être Mary Jones. Ou Mlle Smith aujourd'hui peut-être Docteur Smith demain. L'étranger a cinquante points de santé maintenant, mais a dix après avoir été frappé par le faisceau laser. Certaines choses sont mieux représentés que les mutations.
Est-il une différence sur la façon dont la mémoire est allouée et libéré pour mutable et des objets immuables?
Pas en tant que tel. Comme je l'ai mentionné avant que, une des belles choses au sujet des valeurs inaltérables, c'est que quelque chose que vous pouvez ré-utiliser des parties d'entre eux, sans en faire des copies. Donc, dans ce sens, l'allocation de mémoire peuvent être très différentes.