2009-06-09 15 views

risposta

25

No, non necessariamente, anche se dipende dalla definizione dei termini e non ci sono definizioni molto chiare e ampiamente accettate.

Ad esempio, i linguaggi di programmazione dinamica sono spesso sicuri, ma non fortemente tipizzati. In altre parole, non ci sono informazioni sul tipo in fase di compilazione che determinano cosa è possibile e cosa non può fare con un tipo, ma al momento dell'esecuzione il runtime si assicura che non si usi un tipo come se fosse un altro.

Ad esempio, in C# 4.0, si può fare:

dynamic foo = "hello"; 
dynamic length = foo.Length; // Uses String.Length at execution time 
foo = new int[] { 10, 20, 30 }; 
length = foo.Length; // Uses Array.Length at execution time 
dynamic bar = (FileStream) foo; // Fails! 

L'ultima riga è la chiave per esso che è type-safe: non c'è la conversione al sicuro da un array int a un FileStream, così l'operazione non riesce - invece di trattare i byte dell'oggetto array come se fossero erano FileStream.

EDIT: C# è normalmente sia "fortemente tipizzato" (come lingua) e il tipo di sicurezza: il compilatore non ti consente di tentare di effettuare chiamate arbitrari su un oggetto, e il runtime non ti consente di effettuare conversioni inappropriate .

Non sono del tutto sicuro di dove si inserisca codice non sicuro, non ne so abbastanza per commentare, temo.

La digitazione dinamica in C# 4 consente di digitare codice debolmente tipizzato ma ancora sicuro, come mostrato sopra.

noti che foreach esegue una conversione implicita, rendendolo una specie di ibrido:

ArrayList list = new ArrayList(); 
list.Add("foo"); 

foreach (FileStream stream in list) 
{ 
    ... 
} 

Questo compilerà (c'era another question su questo recente) ma sicuro al momento dell'esecuzione. Ironia della sorte, è perché sei cercando di essere fortemente digitato rispetto alla variabile stream, il che significa che devi eseguire un cast sul risultato dell'iteratore.

+0

Jon, puoi definire/spiegare un po '(se hai tempo) rispetto a C#. – Wondering

+0

Hm, sembra che la tua definizione di "tipo sicuro" significhi semplicemente che il motore di esecuzione non accederà a un pezzo di dati pensando che sia il tipo sbagliato. Sono sorpreso di questo, perché con quella definizione, i generici C# non aggiungono alcun tipo di sicurezza rispetto all'utilizzo di ArrayList non generico, per esempio. Diresti che i generici sono solo esempi di forte digitazione, ma non di sicurezza di tipo? – Timwi

+0

@Timwi: Il CLR fornisce la sicurezza del tipo in entrambi i casi, ma puoi guardarlo ad un livello superiore: se devo eseguire il cast dei risultati dell'estrazione di un valore da un 'ArrayList', quel cast può fallire. Fallirà in un modo abbastanza sicuro, ma l'atto di "ottenere valore di stringa dall'elenco" è ancora più rischioso di quello che sarebbe con un 'Elenco '. –

1

"Tipo sicuro" significa che non è necessario eseguire il cast e che non si possono verificare errori di tipo run-time.

Alcune persone sostengono che "Strongly Typed" non significa niente, o "è buono", o "mi sento a mio agio con esso".

In ogni caso, "Tipo sicuro" si riferisce a una parte di codice o API, quando "Strongly Typed" fa riferimento a un'intera lingua o piattaforma.

+0

In realtà, la sicurezza del tipo non implica che il controllo del tipo venga eseguito in fase di compilazione. Finché viene eseguito * da qualche parte *, allora va tutto bene. – Noldorin

3

Buona domanda. Leggi this voce di Wikipedia, ecco un estratto:

Benjamin C. Pierce, autore di tipi e linguaggi di programmazione avanzati e Tipi e linguaggi di programmazione, dice "Ho trascorso un paio di settimane ... cercando di risolvere fuori la terminologia di "fortemente tipizzato ", "staticamente tipizzato," "sicuro," ecc, e l'ho trovato incredibilmente difficile .... l'uso di questi termini è così varia da rendere loro quasi inutile ."

0

Essi sono la sostanza stessa, è solo una questione di interpretazione:

Da wikipedia:

Type safety:

di sicurezza di tipo è sinonimo di una delle tante definizioni di forte tipizzazione, ma tipo sicurezza e digitazione dinamica sono reciprocamente compatibili.Un linguaggio dinamicamente tipizzato come Smalltalk può essere visto come un linguaggio fortemente tipizzato con un sistema di tipo molto permissivo in cui qualsiasi sintassi il programma corretto di lly è ben tipizzato; Finché la sua semantica dinamica assicura che nessun programma di questo tipo abbia mai "sbagliato" in un senso appropriato, soddisfa la definizione di cui sopra e può essere definito di tipo sicuro.

0

ype safe significa impedire ai programmi di accedere alla memoria al di fuori dei limiti delle proprietà pubbliche di un oggetto. Quando il codice non è sicuro per il tipo, possono verificarsi effetti collaterali indesiderati. La sicurezza del tipo è importante per l'isolamento dell'assieme e l'applicazione della sicurezza. Quando il codice è sicuro dal tipo, il common language runtime può isolare completamente gli assembly l'uno dall'altro

Problemi correlati