• [^] # Re: Un autre bonne raison de ne pas utiliser Mono

    Posté par (site web personnel) . En réponse au journal Utiliser Mono sans peur. Évalué à 1.

    Résultat, il est nécessaire d’appeler manuellement le destructeur des objets
    Non. Tu as besoin de le faire uniquement quand tu veux libéré instantanément la ressource. Dans les 3/4 des cas tu n'as pas besoin de le faire, sans parler du fait que la grande majorité des objets .NET n''implémentent pas IDisposable parcqu'ils n'ont pas besoin de le faire.

    MS n’a pas voulu appeler le destructeur des objets lorsque leur compte de référence tombe à 0 et le fait dans le garbage collector
    En même temps c'est le garbage collector qui compte les références donc bon...

    MS a fait le choix de faire s'exécuter le garbage collector à des moments propices (moment où la machine est moins sollicité ou à des moments critiques : besoin d'espace mémoire), c'est un choix différent de qui se fait dans d'autres VM par exemple mais c'est je trouve relativement pertinent puisque celà limite l'impact sur les performances de l'application.

    il est exécuter dans le contexte du garbage collector, ce qui empêche par exemple la libération les domaines d’application
    Non,c'est un autre problème le CLR n'autorise pas de libérer de domaines d'application tout court, un manque fonctionnel. D'ailleur .NET 4 évolue et propose cette fonctionnalité.

    Enfin l'interface IDisposable est là pour libérer des ressources qui ne sont pas gérées par le garbage collector mais des ressources natives ou des fichiers par exemple : bref c'est loin d'être le cas général pour les objets .NET.

    Et franchement c'est loin d'être "technique" et compliqué de faire un :
    using(var file = File.OpenText("/home/machin/truc.txt"))
    {
    utilisation
    } // appel automatique de IDisposable

    Tu verras aussi qu'en C++/CLI le problème n'est pas présent, et pourtant c'est le même CLR "mal conçu" :
    http://msdn.microsoft.com/fr-fr/library/ms177197.aspx

    Je trouve le développement en .Net extrêmement technique comparé au développement Java
    Alors que le problème est identique en Java... Explique moi le plus simple, le moins technique :

    C++/CLI :
    String^ ReadFirstLineFromFile( String^ path ) {
    StreamReader r(path);
    return r.ReadLine();
    }

    C# :
    String ReadFirstLineFromFile( String path ) {
    using ( StreamReader r = new StreamReader(path) ) {
    return r.ReadLine();
    }
    }

    Java :
    String ReadFirstLineFromFile( String path ) {
    StreamReader r = null;
    String s = null;
    try {
    r = new StreamReader(path);
    s = r.ReadLine();
    } finally {
    if ( r != null ) r.Dispose();
    }
    return s;
    }

    En Python, il me semble qu'il n'y a aucune garantie que le destructeur soit appelé quand l'interpréteur s'arrête, tu trouves ca mieux ?

    En C++ tu trouves ca simple et pas technique ces méthodes virtuelles appelées dans un destructeur si on fait pas attention ?