2012-08-23 9 views
7

ho capito provando chePerché usare @property in D?

struct PropertyTest 
{ 
    @property int x() { return val; } 
    @property void x(int newVal) { val = newVal; } 

    void test() 
    { 
     int j; 
     j = x; 
     x = 5; 
    } 

private: 
    int val; 
} 

fa esattamente la stessa cosa quando lascio la @property fuori. Tutto va bene. Qual è il punto allora per dichiarare funzioni come @property?

BTW, sto usando il compilatore dmd2.

+1

Al momento il compilatore è più permissivo di quello che potrebbe essere in futuro. Contrassegnare getter e setter con @property è un buon metodo per la prova futura. Per vedere come sarà il futuro, compilare con -property. –

risposta

9

Il motivo per cui funzionano senza @property è perché @property è stato aggiunto dopo aver consentito la sintassi del metodo proprietà. L'aggiunta di -property alla riga di comando DMD applica l'annotazione @property. Non è l'impostazione predefinita per motivi di compatibilità con le versioni precedenti. Un giorno diventerà il default (o almeno così dicono) quindi è meglio compilare con -property per assicurarti di annotare correttamente.

1

Consente di utilizzare un metodo no-arg senza parentesi (come la lettura di una variabile) e consente di chiamare un metodo a singolo arg senza parentesi, il modo in cui si assegna a una variabile.

@property int foo() { ... } 
@property void bar(int x) { ... } 

void main() 
{ 
    bar = foo; 
} 

È necessario specificare -property come una riga di comando l'opzione per il compilatore.