2010-03-13 66 views

回答

62

如果你問「類型安全」的一般手段的想法,那就是允許開發人員是某些代碼的特性直接支持一個價值或客體會表現出某些性質(即屬於某種類型),以便他/她能夠以特定的方式使用它,而不用擔心意外或未定義的行爲。

例如,在C#中,你可以說ArrayList類型安全的,因爲它可以存儲任何對象,這意味着你可以做類似如下:

var integers = new ArrayList(); 
integers.Add(1); 
integers.Add(2); 
integers.Add("3"); 

for (int i = 0; i < integers.Count; ++i) { 
    int integer = (int)integers[i]; 
    // do something 
} 

的由於String派生自Object(如Int32),所以上面將編譯,因爲值「3」即使它是一個字符串而不是一個整數也可以合法地添加到ArrayList。但是,當您嘗試將integer設置爲(int)integers[2]時,它會拋出InvalidCastException,因爲String不能被鑄造轉換爲Int32

在另一方面,List<T>類型安全爲正好相反的理由。 - 即,上面的代碼將不編譯如果integers是一個List<int>。您開發人員從類型安全的List<int>訪問的任何值您可以是某些int(或任何相應的T適用於任何通用List<T>);因此您可以確保您可以執行操作,例如投射到int(顯然)或者說long

+0

我不同意你的看法。 ArrayList既不是類型安全的,也不是類型安全的:http://stackoverflow.com/a/17984521/1145224。 – Spirit 2016-02-02 22:52:55

+1

他只是試圖解釋類型檢查的重要性,他並不想解釋有關數組列表的特徵。 – clarifier 2017-05-21 14:24:48

10

類型安全代碼只訪問 存儲位置,它被授權訪問 。例如,類型安全代碼 無法從另一個 對象的專用字段中讀取值。它只能以明確定義的方式訪問 類型,允許的方式爲 。

在剛剛在時間(JIT)編譯, 可選驗證過程 檢查一個 方法的元數據和微軟 中間語言(MSIL)被JIT編譯成本機 機器代碼,以驗證它們是 類型安全。如果 代碼有權繞過 驗證

雖然類型安全 的驗證是不是強制性的運行託管代碼這一過程被跳過, 類型安全起着 裝配隔離和安全 執法至關重要的作用。當代碼是類型安全的, 公共語言運行庫可以 彼此完全隔離程序集從 。此隔離有助於 確保程序集不能相互影響 ,並且它提高了應用程序的可靠性。

欲瞭解更多請參考msdn link

一個很好的文章,解釋它是here

+0

也對此響應+1。 – Sumeet 2011-05-09 07:10:37

+2

最後一個鏈接被破壞。 – Banjocat 2014-11-06 22:13:18

13

Ç - 你宣佈一個int,它轉換成char和存取存儲器超出INT的邊界

int i = 10; 
char *s = (char*)i; 
print(*(s+10)); 

C# - 類型很安全

int i = 10; 
char *s //This is invalid unless you are using unsafe context. 

指針不被.NET

+0

+1 TypeSafe與CLR或程序的內存訪問有關,而不是關注TYPES。因此,針對此實際差異的+1響應。 REF:http://www.exforsys.com/tutorials/csharp/.-net-type-safety.html – Sumeet 2011-05-09 06:57:02

+0

C沒有奇怪的演員是*類型安全*(除非常古老的所有標準)。你們的樣本在這方面並不嚴格。你說...可以說...關於記憶安全/不安全的解決方案?具有奇怪轉換的C#在正常部分可能是不安全的(「非不安全」):正面編譯,運行時錯誤 – 2015-09-25 06:29:20

-1

已引入.NET中的類型安全性,以防止一種類型的對象窺探爲其他對象分配的內存。

例如,詳細的討論,請visit this link

+0

不同問題的好回答:) – 2015-09-25 06:30:28

-2

我不與這裏的一些答案一致。 C#的安全級別很低

編輯:類型安全有2個層面的含義(如我們一般鐵餅關於編程語言,因爲在這個線程)

一個是編譯時類型安全,靠近重構等,編譯器捕捉錯別字,拼寫錯誤的值分配給錯誤的變量(屬性),即字符串到int變量。典型的C#代碼是類型安全的,已知的禁用此功能的方式是dynamic關鍵字,或者非泛型容器,像上面這樣的錯誤會延遲到運行時。例如:非編譯C/C++代碼在編譯時通常是安全的。我認爲可能寫入(黑客)鑄造在C#中隱藏類型衝突。

下一級別是運行時類型安全,C#通常是安全的(沒有不安全的部分)。即使動態值也會在運行時檢查。相反:C/C++在運行時不是類型安全的。如果編譯器接受代碼,則不會在運行時檢查非邏輯分配,從而爲C語言提供典型的奇怪/奇怪/系統級或遲延錯誤。

很少有回答者在這個線程中混合了C#安全的其他領域(內存安全,範圍安全,空指針等)。嚴格來說,這些都是不同的安全。

理論:https://en.wikipedia.org/wiki/Type_safety

0

你的意思是類型安全的特別或類型安全帶來什麼影響?

我不同意接受的答案:ArrayList的是類型安全的無知(既不是類型安全的,也沒有類型安全):https://stackoverflow.com/a/17984521/1145224

裏希特 - 通過C#,第4版(第93頁)CLR:

類型安全是CLR的主要特徵。您始終可以通過調用非虛擬 System.Object的GetType方法來始終發現 對象的確切類型。

例如Hero類不能覆蓋GetType方法成爲一種SuperHero類型。

此System.Object功能使CLR能夠檢查在運行時投射對象的可能性。例如:

internal class Employee { ... } 

public sealed class Program 
{ 

    public static Main() 
    { 
     DateTime dt = new DateTime(2016, 1, 1); 
     PromoteEmployee(newYears); 
    } 

    public static PromoteEmployee(Object o) 
    { 
     Employee e = (Employee)o; //InvalidCastException, runtime error 
    } 
} 

將Casting DateTime類型轉換爲Employee類型是一個非類型安全嘗試投入的示例。

相關問題