Il était avant tout un développeur C++, l'absence de RAII (Acquisition de Ressources Est d'Initialisation) en Java et .NET a toujours dérangé. Le fait que le fardeau de nettoyage est déplacé à partir de la classe de l'écrivain à sa consommation ( try finally
ou .NET using
construire) semble être nettement inférieur.
Je ne vois pourquoi en Java il n'y a pas de support pour le RAII, puisque tous les objets sont situés sur le tas et le garbage collector, intrinsèquement, ne prend pas en charge déterministe de la destruction, mais dans .NET avec l'introduction de types de valeur (struct
) nous ont (apparemment) candidat parfait pour le RAII. Un type de la valeur qui est créée sur la pile a un sens bien défini la portée et destructeur C++ sémantique peut être utilisé. Cependant, le CLR ne permettent pas à un type de valeur afin d'avoir un destructeur.
Mon hasard des recherches a trouvé un argument que, si une valeur est de type boîte , il relève de la compétence de la collecte des déchets et donc sa destruction devient non-déterministe. J'ai l'impression que cet argument n'est pas assez fort, les avantages de la RAII sont assez grands pour dire qu'une valeur de type avec un destructeur ne peut pas être mis en boîte (ou utilisé comme un membre de la classe).
Pour couper une longue histoire courte, ma question est: existe-t-il d'autres raisons de types de valeur ne peut pas être utilisée pour introduire RAII .NET? (ou vous pensez que mon argument sur RAII est évident que les avantages sont défectueux?)
Edit: j'ai pas formulée de la question clairement depuis les quatre premières réponses ont manqué le point. Je sais à propos de Finalize
et de sa non-déterministe caractéristiques, je sais à propos de l' using
construire et je crois que ces deux options sont inférieures à RAII. using
est une chose que la consommation d'une classe doit de rappeler combien de personnes j'ai oublié de mettre un StreamReader
en using
bloc?). Ma question est philosophique sur le langage de conception, pourquoi est-ce la façon dont il est et peut-il être amélioré?
Par exemple avec un générique de façon déterministe destructibles type de valeur que je peux faire l' using
et lock
mots-clés redondante (ce qui est réalisable par la bibliothèque de classes):
public struct Disposer<T> where T : IDisposable
{
T val;
public Disposer(T t) { val = t; }
public T Value { get { return val; } }
~Disposer() // Currently illegal
{
if (val != default(T))
val.Dispose();
}
}
Je ne peux pas aider, mais à la fin avec un apropos devis que j'ai vu une fois, mais ne peut pas trouver son origine.
Vous pouvez prendre mon déterministe de la destruction lors de mon rhume de main morte, est hors de portée. --Anon