La sécurité des types signifie que le compilateur valide les types lors de la compilation et génère une erreur si vous essayez d'attribuer un type incorrect à une variable.
Quelques exemples simples :
// Fails, Trying to put an integer in a string
String one = 1;
// Also fails.
int foo = "bar";
Cela s'applique également aux arguments de méthode, puisque vous leur transmettez des types explicites :
int AddTwoNumbers(int a, int b)
{
return a + b;
}
Si j'essayais d'appeler ça en utilisant :
int Sum = AddTwoNumbers(5, "5");
Le compilateur émettrait une erreur, car je passe une chaîne de caractères ("5"), alors qu'il attend un nombre entier.
Dans un langage faiblement typé, comme le javascript, je peux faire ce qui suit :
function AddTwoNumbers(a, b)
{
return a + b;
}
si je l'appelle comme ça :
Sum = AddTwoNumbers(5, "5");
Javascript convertit automatiquement le 5 en une chaîne de caractères, et renvoie "55". Ceci est dû au fait que javascript utilise le signe + pour la concaténation des chaînes de caractères. Pour qu'il tienne compte du type, il faudrait faire quelque chose du genre :
function AddTwoNumbers(a, b)
{
return Number(a) + Number(b);
}
Ou, peut-être :
function AddOnlyTwoNumbers(a, b)
{
if (isNaN(a) || isNaN(b))
return false;
return Number(a) + Number(b);
}
si je l'appelle comme ça :
Sum = AddTwoNumbers(5, " dogs");
Javascript convertit automatiquement les 5 en une chaîne de caractères, et les ajoute, pour retourner "5 chiens".
Tous les langages dynamiques ne sont pas aussi indulgents que le javascript (en fait, un langage dynamique n'implique pas implicitement un langage à typage lâche (voir Python)), certains d'entre eux vous donneront même une erreur d'exécution en cas de casting de type invalide.
Bien que ce soit pratique, cela vous expose à de nombreuses erreurs qui peuvent être facilement manquées et identifiées uniquement en testant le programme en cours d'exécution. Personnellement, je préfère que mon compilateur me dise si j'ai fait cette erreur.
Maintenant, revenons à C#...
C# prend en charge une fonctionnalité du langage appelée covariance Cela signifie essentiellement que vous pouvez remplacer un type de base par un type enfant sans provoquer d'erreur, par exemple :
public class Foo : Bar
{
}
Ici, j'ai créé une nouvelle classe (Foo) qui sous-classe Bar. Je peux maintenant créer une méthode :
void DoSomething(Bar myBar)
Et appelez-le en utilisant soit un Foo, soit un Bar comme argument, les deux fonctionneront sans causer d'erreur. Cela fonctionne parce que C# sait que toute classe enfant de Bar implémentera l'interface de Bar.
Cependant, vous ne pouvez pas faire l'inverse :
void DoSomething(Foo myFoo)
Dans cette situation, je ne peux pas passer Bar à cette méthode, car le compilateur ne sait pas que Bar implémente l'interface de Foo. En effet, une classe enfant peut être (et sera généralement) très différente de la classe parent.
Bien sûr, j'ai maintenant dépassé le cadre de la question initiale, mais c'est bon à savoir :)
0 votes
fr.wikipedia.org/wiki/Type_safety