2017-04-05 2 views
4

Je suis en train de tester le code suivant en C# et il peut être exécuté avec succès. Ma question est que je peux assigner un type de données à un autre type de données dans l'exemple suivant, mais pourquoi est-ce encore appelé langage de type sécurisé? Merci.C# est-il un langage sûr? Que diriez-vous de mon exemple?

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text.RegularExpressions; 

    namespace Rextester 
    { 
     public class Program 
     { 
      public static void Main(string[] args) 
      { 
       var intNum = 5; 
       var strNum = "5"; 
       var result = intNum + strNum;   
       Console.WriteLine(result); 
      } 
     } 
    } 

Il peut être compilé avec succès et le résultat est 55.

+1

Copie possible de [Qu'est-ce que la sécurité de type dans .net?] (Http://stackoverflow.com/questions/2437469/what-is-type-safe-in-net) – ElektroStudios

+0

http://stackoverflow.com/a/3398629/5621827 peut aider – jitender

+0

Non, ma question est 1) est C# est un type de langage sûr? Oui ou Non. 2) Si la réponse est oui, alors pourquoi mon code peut être respecté avec succès. Cela signifie-t-il que mon exemple ne concerne pas le problème de type sécurité. Merci. – user1232250

Répondre

1

Oui c'est. Votre exemple utilise var qui a une signification très différente de C#, en JavaScript. En C# c'est plus un sucre syntatique. Le code que vous avez écrit est équivalent de ce qui suit -

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text.RegularExpressions; 

namespace Rextester 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      int intNum = 5; 
      string strNum = "5"; 
      string result = String.Concat(intNum, strNum);   
      Console.WriteLine(result); 
     } 
    } 
} 

Donc, fondamentalement, le compilateur regarde le côté droit d'une déclaration var de décider du bon type. C'est en quelque sorte dire au compilateur d'obtenir le type (temps de compilation strict) parce que je suis trop paresseux pour m'en préoccuper.

Mais il sert un objectif plus large, il vous permet de traiter anonymous types.

Enfin, pour démontrer hors de tout doute que var est de type vraiment sûr, essayez le code suivant ...

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text.RegularExpressions; 

namespace Rextester 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      var intNum = 5; 
      var strNum = "5"; 
      var result = intNum + strNum; 
      // Let's re-purpose result to store an int 
      result = 6; 
      // or this 
      result = intNum; 
      Console.WriteLine(result); 
     } 
    } 
} 

Ceci est parfaitement valable dans un langage de type agnostique (disons à nouveau JavaScript).

0

De MSDN:

Code typées accède uniquement les emplacements de mémoire, il est autorisé à accès. (Pour cette discussion, la sécurité de type se réfère spécifiquement à sécurité de type de mémoire et ne doit pas être confondue avec la sécurité de type dans un plus large respect.) Par exemple, le code de sécurité ne peut pas lire les valeurs de les champs privés d'un autre objet. Il accède aux types uniquement en des manières bien définies et autorisées.

Pendant juste à temps (JIT), un processus de vérification en option examine les métadonnées et le langage intermédiaire Microsoft (MSIL) d'une compilation JIT méthode pour être en code machine natif pour vérifier qu'ils sont de type sûr. Ce processus est ignoré si le code a l'autorisation de contourner la vérification. Pour plus d'informations sur la vérification , voir Processus d'exécution gérée.

Bien que la vérification de la sécurité de type ne soit pas obligatoire pour exécuter le code géré, le type de sécurité joue un rôle crucial dans l'isolation de l'assemblage et l'application de la sécurité . Lorsque le code est de type sécurisé, le langage commun runtime peut isoler complètement les assemblages les uns des autres. Cette isolation permet de s'assurer que les assemblages ne peuvent pas affecter les autres et augmente la fiabilité de l'application. Les composants de type sécurité peuvent s'exécuter en toute sécurité dans le même processus, même s'ils sont approuvés à différents niveaux. Lorsque le code n'est pas de type sécurisé, des effets indésirables peuvent apparaître . Par exemple, le moteur d'exécution ne peut pas empêcher le code managé de d'appeler un code natif (non géré) et d'exécuter des opérations malveillantes. Lorsque le code est de type sécurisé, le mécanisme de sécurité de l'exécution garantit qu'il n'accède au code natif que s'il dispose de l'autorisation pour le faire. Tout code qui n'est pas de type sécurisé doit avoir été accordé à SecurityPermission avec le membre enum passé SkipVerification pour s'exécuter.

Plus un shorter explanation:

Si vous vous demandez ce que l'idée de "type-safe" dans les moyens généraux, il est la caractéristique de code qui permet au développeur d'être certain qu'une valeur ou un objet présentera certaines propriétés (ie, être d'un certain type) afin qu'il puisse l'utiliser d'une manière spécifique sans craindre de comportement inattendu ou indéfini.

... et un exemple illustratif détaillé sur cet URL.

+0

Probablement aurait été préférable de résumer ce mur de texte ou au moins ** gras ** les bits importants – MickyD

3

le type de sécurité signifie qu'il garantit que seules les opérations autorisées par la définition de type peuvent être appliquées à la mémoire de l'objet, par ex. vous ne pouvez pas convertir un objet en un type incompatible.

A propos de l'opérateur + concaténer une chaîne et entier, cela est spécifié dans la section 7.8.4 du C# 4 spec:

Pour une opération de la forme x + y, la surcharge de l'opérateur binaire résolution (§7.3.4) est appliqué pour sélectionner une implémentation d'opérateur spécifique . Les opérandes sont convertis en les types de paramètres l'opérateur sélectionné, et le type de résultat est le type de retour de l'opérateur.

Les opérateurs d'addition prédéfinis sont listés ci-dessous. Pour les types d'énumération numérique et , les opérateurs d'addition prédéfinis calculent la somme des deux opérandes. Lorsque l'un des opérandes ou les deux sont de type chaîne, les opérateurs d'addition prédéfinis concaténent la représentation sous forme de chaîne de les opérandes.

+1

Merci pour votre réponse. Cependant, pouvez-vous simplement répondre à ma question ci-dessous: 1) C# est un type de langage sûr? Oui ou Non. 2) Si la réponse est oui, alors pourquoi mon code peut être respecté avec succès. Cela signifie-t-il que mon exemple ne concerne pas le problème de type sécurité. Merci. – user1232250

4

Pour répondre à vos questions répétées dans les commentaires:

  1. est C# est un type langage sûr? Oui ou non

Oui.

  1. Si la réponse est oui, alors pourquoi mon code peut-il être satisfait. Cela signifie-t-il que mon exemple ne concerne pas le problème de type sécurité.

Votre exemple ne concerne pas le problème de type sécurité.
Notez d'abord que var est juste un sucre syntaxique, le compilateur assignera le bon type à vos variables basées sur le côté droit.

En d'autres termes, vous vous demandez pourquoi ce qui suit est valable:

int intNum = 5; 
string strNum = "5"; 
string result = intNum + strNum; 
Console.WriteLine(result); 

valide parce que .NET prend en charge ce genre de concaténation de chaîne, voir la Concat method suivante.

string result = string.Concat(intNum, strNum); 

La méthode concatène les deux arguments en appelant la méthode ToString sur eux.