C# 2.0 e static class

In C# 1.x se volevo fare una classe di soli membri statici mi accontentavo di fare così:

namespace BudgetForecast.DataLayer
{
    public sealed class AlberoTarget
    {
        private AlberoTarget() {}

        public static System.Data.DataTable GetNodiRadice() { return null; }

    } 
}

Ma con queste controindicazioni:

  1. per errore avrei potuto aggiungere un metodo di istanza
  2. per errore avrei potuto aggiungere del codice al costruttore privato
  3. per "malizia" avrei potuto aggiungere la classe nidificata Alberotarget.NodoAlbero la quale riuscirebbe ad istanziare AlberoTarget

Aggiungendo un abstract però riuscirei a risolvere i punti 1) e 3) e il compilatore potrebbe avvisarmi del problema del punto 2):

namespace BudgetForecast.DataLayer
{
    public abstract sealed class AlberoTarget
    {

        public static System.Data.DataTable GetNodiRadice() { return null; }

    } 

}

Ma dalle specifiche del C# 1.x: una classe abstract non può essere sealed. Non avevano pernsato che la cosa poteva avere un senso ed essere utile?

Nel C#2.0 hanno rimosso questa limitazione? No, hanno preferito aggiungere una nuova keywork static che crea appunto una classe abstract sealed.

Ciò che ha distinto il C# 1.x dal C++ è la scelta di un punto ottimale di equilibrio/compromesso tra la potenza e la complessità del linguaggio per ridurre la probabilità di bug, ridurre i costi di formazione e aumentare la produttività.

Ciò che distingue il C++ dal C# è il fatto che le funzionalità del C++ possono essere combinate tra loro per "creare" nuove funzionalità (es. la derivazione privata, i metodi virtuali privati, ...).

Insomma... questa scelta di creare una nuova keyword invece che usare le esistenti mi sembra che aumenti la complessità senza dare maggiore potenza e mi sembra un atto di sfiducia nella capacità degli sviluppatori C# di combinare in modo creativo le funzionalità del linguaggio.

Se non si è capito... la cosa non incontra i miei gusti ;-)

Print | posted @ venerdì 18 febbraio 2005 03:20

Comments on this entry:

Gravatar # re: C# 2.0 e static class
by Adrian Florea at 18/02/2005 12:54

Vediamo anche cosa dicono le specifiche di C++/CLI:

18.1.1. "abstract and sealed can be used together; that is, they are not mutually exclusive. As non-member functions are not CLS-compliant, a substitute is to use an abstract sealed class, which can contain static member functions. This is the utility class pattern."

C++/CLI Language Specification. Working Draft 1.5 (Jun, 2004)
Gravatar # re: C# 2.0 e static class
by Marco at 24/08/2006 20:17

Sintax error:
se volevo fare una classe
se AVESSI VOLUTO fare una classe
;D
Comments have been closed on this topic.