2017-04-05 1 views
4

Ich teste den folgenden Code in C# und es kann erfolgreich ausgeführt werden. Meine Frage ist, dass ich im folgenden Beispiel eine Art von Daten einer anderen Art von Daten zuordnen kann, aber warum wird sie immer noch als typsichere Sprache bezeichnet? Vielen Dank.Ist C# eine typsichere Sprache? Wie wäre es mit meinem Beispiel?

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); 
      } 
     } 
    } 

Es kann erfolgreich kompiliert werden und das Ergebnis ist 55.

+1

Mögliches Duplikat von [Was ist in .net typsicher?] (Http://stackoverflow.com/questions/2437469/what-is-type-safe-in-net) – ElektroStudios

+0

http://stackoverflow.com/a/3398629/5621827 kann helfen – jitender

+0

Nein, meine Frage ist 1) ist C# eine typsichere Sprache? Ja oder Nein. 2) Wenn die Antwort Ja ist, dann kann mein Code erfolgreich ausgeführt werden. Bedeutet dies, dass sich mein Beispiel nicht auf ein typsicheres Problem bezieht? Vielen Dank. – user1232250

Antwort

1

Ja ist es. Ihr Beispiel verwendet var, das in C# eine ganz andere Bedeutung hat als in JavaScript. In C# ist es eher ein syntaktischer Zucker. Der Code, den Sie geschrieben entspricht der folgenden -

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); 
     } 
    } 
} 

Also im Grunde, der Compiler auf der rechten Seite einer var Erklärung über die richtige Art zu entscheiden aussieht. Es ist eine Art zu sagen, der Compiler, um den Typ zu bekommen (streng Kompilierzeit), weil ich zu faul bin, mich damit zu befassen.

Aber es dient einem größeren Zweck, damit Sie mit anonymous types umgehen können.

Schließlich zweifelsfrei zu beweisen, dass var wirklich sicher ist, geben Sie, versuchen Sie den folgenden Code-Schnipsel ...

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); 
     } 
    } 
} 

Das ist vollkommen gültig in einer Art Agnostiker Sprache (wieder JavaScript sagen).

0

Von MSDN:

Typ sicheren Code greift nur auf die Speicherplätze es Zugriff autorisiert ist. (Für diese Diskussion bezieht sich Typ Sicherheit speziell auf Speichertyp Sicherheit und sollte nicht mit Typ Sicherheit in einem breiteren Zusammenhang verwechselt werden.) Zum Beispiel kann typsicherer Code keine Werte von anderen privaten Feldern eines Objekts lesen. Es greift auf Typen nur in gut definierten, zulässigen Wegen zu.

Während Just-in-Time (JIT) Kompilierung, ein optionaler Überprüfung Prozess die Metadaten und Microsoft Intermediate Language (MSIL) eine Methode, um untersucht in nativen Maschinencode JIT-kompilierte überprüfen, ob sie Typ sind sicher. Dieser Prozess wird übersprungen, wenn der Code die Berechtigung hat, die Verifizierung zu umgehen. Weitere Informationen zur Verifizierung von finden Sie unter Managed Execution-Prozess.

Obwohl die Überprüfung der Typensicherheit nicht zwingend erforderlich ist, um verwalteten Code auszuführen, spielt der Typ Sicherheit eine entscheidende Rolle bei der Isolation der Baugruppe und Sicherheitsdurchsetzung. Wenn Code typsicher ist, kann die Common Language Runtime Baugruppen vollständig voneinander isolieren. Diese Isolierung hilft sicherzustellen, dass Baugruppen nicht jede andere andere beeinträchtigen können, und es erhöht die Zuverlässigkeit der Anwendung. Typsichere Komponenten können im selben Prozess sicher ausgeführt werden, auch wenn sie unter verschiedenen Ebenen vertrauenswürdig sind. Wenn der Code nicht typsicher ist, können unerwünschte Nebenwirkungen auftreten . Die Laufzeitumgebung kann beispielsweise nicht verhindern, dass verwalteter Code von in nativen (nicht verwalteten) Code aufgerufen und bösartige -Operationen ausgeführt wird. Wenn der Code typsicher ist, stellt der Mechanismus für die Sicherheitsüberwachung der Laufzeit sicher, dass er nicht auf den systemeigenen Code zugreift, sofern er nicht über die Berechtigung verfügt. Der gesamte Code, der nicht typsicher ist, muss SecurityPermission mit dem übergebenen Enum-Member SkipVerification gewährt werden.

Plus eine shorter explanation:

Wenn Sie sich fragen, was die Idee der „typsichere“ im Allgemeinen bedeutet, es ist die Charakteristik des Codes, der Entwickler sicher sein können dass ein Wert oder ein Objekt bestimmte Eigenschaften aufweisen (dh von einem bestimmten Typ sein), so dass er/sie es in einer bestimmten Weise ohne Angst vor unerwartetem oder undefiniertem Verhalten verwenden kann.

... und ein detailliertes Beispiel für diese URL.

+0

Wahrscheinlich wäre es besser gewesen, diese Textwand zusammenzufassen oder zumindest ** fett ** die wichtigen Bits – MickyD

3

Typ sicher bedeutet, dass sichergestellt wird, dass nur Operationen, die durch die Typdefinition erlaubt sind, auf den Speicher des Objekts angewendet werden können, z. Sie können ein Objekt nicht auf einen inkompatiblen Typ umwandeln.

über den + Operator einen String und integer Verketten wird diese 7.8.4 der C# 4 spec in Abschnitt:

für eine Operation der Form x + y, Überlast Binäroperator Auflösung (§7.3.4) wird angewendet, um einen spezifischen Operator Implementierung auszuwählen. Die Operanden werden in die Parametertypen des ausgewählten Operators konvertiert, und der Typ des Ergebnisses ist der Rückgabetyp des Operators.

Die vordefinierten Additionsoperatoren sind unten aufgeführt. Bei numerischen Aufzählungstypen und Aufzählungstypen berechnen die vordefinierten Additionsoperatoren die Summe der beiden Operanden. Wenn einer oder beide Operanden vom Typ string sind, verketten die vordefinierten Additionsoperatoren die Zeichenfolgendarstellung der Operanden .

+1

Vielen Dank für Ihre Antwort. Können Sie jedoch einfach meine Frage beantworten: 1) Ist C# eine typsichere Sprache? Ja oder Nein. 2) Wenn die Antwort Ja ist, dann kann mein Code erfolgreich ausgeführt werden. Bedeutet dies, dass sich mein Beispiel nicht auf ein typsicheres Problem bezieht? Vielen Dank. – user1232250

4

Um Ihre wiederholten Fragen in den Kommentaren zu beantworten:

  1. C# ist eine Art sichere Sprache? Ja oder Nein.

Ja.

  1. Wenn die Antwort ja ist, dann kann mein Code erfolgreich ausgeführt werden. Bedeutet dies, dass sich mein Beispiel nicht auf ein typsicheres Problem bezieht?

Ihr Beispiel bezieht sich nicht auf ein typsicheres Problem.
Erste Notiz, dass var ist nur eine syntaktische Zucker, der Compiler wird den richtigen Typ zu Ihren Variablen auf der rechten Seite zuweisen.

Mit anderen Worten, fordern Sie, warum das folgende gilt:

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

das gültig ist, weil .NET diese Art von String-Verkettung unterstützt, die folgende Concat method sehen.

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

Die Methode verkettet beide Argumente, indem sie die ToString-Methode für sie aufruft.

Verwandte Themen