The Artima Developer Community
Sponsored Link

.NET Buzz Forum
Riflettate sul Reflector

0 replies on 1 page.

Welcome Guest
  Sign In

Go back to the topic listing  Back to Topic List Click to reply to this topic  Reply to this Topic Click to search messages in this forum  Search Forum Click for a threaded view of the topic  Threaded View   
Previous Topic   Next Topic
Flat View: This topic has 0 replies on 1 page
Adrian Florea

Posts: 206
Nickname: adrian11
Registered: Jul, 2004

Adrian Florea is a .NET developer from Italy
Riflettate sul Reflector Posted: Sep 5, 2006 5:07 AM
Reply to this message Reply

This post originated from an RSS feed registered with .NET Buzz by Adrian Florea.
Original Post: Riflettate sul Reflector
Feed Title: Web Log di Adrian Florea
Feed URL: /error.aspx?aspxerrorpath=/adrian/Rss.aspx
Feed Description: "You know you've achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away." Antoine de Saint-Exupery
Latest .NET Buzz Posts
Latest .NET Buzz Posts by Adrian Florea
Latest Posts From Web Log di Adrian Florea

Advertisement

A volte, il codice "riflesso" con il Reflector, ci mette su false piste. Qualcuno, guardando per esempio l'implementazione dei singleton delle classi factory dei provider ADO.NET, tramite il Reflector, potrebbe erroneamente pensare che inizializzare esplicitamente un campo statico nel costruttore statico fosse una best practice:

// snippet 1
// codice tramite il Reflector
namespace System.Data.SqlClient
{
    public sealed class SqlClientFactory : DbProviderFactory
    {
        public static readonly SqlClientFactory Instance;
 
        // codice non ottimizzato
        static SqlClientFactory()
        {
            Instance = new SqlClientFactory();
        }
 
        private SqlClientFactory() { }
 
        // ...
    }
}

E invece, il codice "reale" è questo:

// snippet 2
namespace System.Data.SqlClient
{
    public sealed class SqlClientFactory : DbProviderFactory
    {
        // codice ottimizzato
        public static readonly SqlClientFactory Instance = new SqlClientFactory();
 
        private SqlClientFactory() { }
 
        // ...
    }
}

Come ci si accorge? Dal flag IL beforefieldinit con cui è decorata la classe:

.class public auto ansi sealed beforefieldinit System.Data.SqlClient.SqlClientFactory extends System.Data.Common.DbProviderFactory{}

Lo snippet 1 non genera il flag beforefieldinit, lo snippet 2 invece sì - purtroppo il Reflector non è ancora capace di fare la differenza tra i due snippet.

La linea guida è (FDG, p. 131):

"Consider initializing static fields inline rather than explicitly using static constructors, as the runtime is able to optimize performance of types that don't have an explicitly defined static constructor."

So che la questione del beforefieldinit non è per nulla nuova (in questo post di Simone potete trovare anche altri link interessanti a riguardo) ma quello che volevo sottolineare qui è solo l'invito di riflettare un po' di più sugli idiom che notiamo tramite Reflector.

Read: Riflettate sul Reflector

Topic: Microsoft .NET Framework 3.0 - Release Candidate download Previous Topic   Next Topic Topic: This blog is claimed as a Technorati Blog���

Sponsored Links



Google
  Web Artima.com   

Copyright © 1996-2019 Artima, Inc. All Rights Reserved. - Privacy Policy - Terms of Use