2015-07-07 4 views

risposta

5

La sezione tipo dinamico dagli Dart Programming Language Specification, 3rd Edition stati:

tipo dinamico ha metodi per ogni possibile identificatore e arity, con ogni possibile combinazione di parametri denominati. Questi metodi hanno tutti lo dinamico come tipo di ritorno e i loro parametri formali hanno tutti il ​​tipo dinamico. Il tipo dinamico ha proprietà per ogni possibile identificatore. Queste proprietà tutte hanno tipo dinamico.

Ciò significa che non riceverai avvisi chiamando qualsiasi metodo su una variabile tipizzata dynamic. Questo non sarà il caso con una variabile digitata come Object. Ad esempio:

dynamic a; 
Object b; 

main() { 
    a = ""; 
    b = ""; 
    printLengths(); 
} 

printLengths() { 
    // no warning 
    print(a.length); 

    // warning: 
    // The getter 'length' is not defined for the class 'Object' 
    print(b.length); 
} 

A runtime, penso, non dovresti notare alcuna differenza.

2

Per aggiungere alla risposta di Alexandre la differenza pratica, c'è anche una differenza semantica tra i due, e usare quello giusto aiuterà a comunicare meglio il tuo intento con altri programmatori.

Quando si utilizza Object si sta dicendo che si conosce il tipo con cui si sta lavorando ed è Object. Per esempio:

int getHashCode(Object obj) { 
    return obj.hashCode; 
} 

Dal hashCode è una proprietà su Object usiamo Object come il tipo di parametro per specificare che la funzione può accettare nulla di tipo Object.

D'altra parte, utilizzando dynamic significa che il sistema Dart non può esprimere correttamente il tipo che si desidera utilizzare:

void setEmail(dynamic email) { 
    if (email is Email) { 
    _email = email; 
    } else if (email is String) { 
    _email = new Email.fromString(email); 
    } 
} 

Dato Dart attualmente non supporta i tipi di unione non c'è modo per esprimere la . tipo Email | String così siamo costretti a utilizzare dynamic di accettare tutti i tipi e quindi gestire solo i casi in cui il tipo è uno che ci interessa

+0

Non c'è in realtà alcuna differenza tra l'uso di 'Object' e' dynamic' nell'esempio che hai fornito qui. – lrn

+0

Non c'è alcuna differenza pratica, ed è possibile scambiare i due e il programma funzionerà allo stesso modo. Quando mi riferisco alla "differenza semantica", intendo come il codice sarà compreso da altri programmatori di Dart. Ho leggermente modificato la mia risposta per rispecchiarlo meglio. –

3

un altro punto di vista su dynamic è che non è davvero un tipo - è un modo per trasformare disattivare il controllo e indicare il tipo statico sys "fidati di me, so cosa sto facendo". La scrittura var o; dichiara una variabile che non è stata digitata: è invece contrassegnata come "non controllata dal testo".

Quando si scrive Object o = something; si dice al sistema che non può assumere nulla su o tranne che è un Object. È possibile chiamare toString e perché tali metodi sono definiti su Object, ma se si tenta di fare o.foo() si riceverà un avviso - non si può vedere che è possibile farlo e quindi si avverte che il codice è probabilmente sbagliato.

Se si scrive var o = something si sta dicendo al sistema di non assumere nulla e di non controllare nulla. Se scrivi o.foo() allora non ti avviserà.Hai detto che "qualsiasi cosa relativa a o è OK! Fidati di me, so cosa sto facendo", e quindi pensa che o.foo() sia OK.

Con una grande potenza arriva una grande responsabilità - se disabiliti il ​​controllo dei caratteri per una variabile, ricade su di te per essere sicuro di non fare nulla di sbagliato.