2009-06-09 12 views

答えて

25

あなたの用語の定義にもよりますが、必ずしもそうではありません。非常に明確かつ広く受け入れられている定義はありません。

たとえば、動的プログラミング言語は型保護されていますが、厳密に型指定されていないことがよくあります。言い換えれば、コンパイル時の型情報は、型で何ができるかできないかを決定するものではありませんが、実行時に、ある型を他の型と同じように使用しないようにします。あなたが行うことができますC#4.0に、例えば

、:

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! 

最後の行は、それがタイプセーフであることへの鍵です:FileStreamにint配列からの安全な変換、その操作はありません配列オブジェクトのバイトをのように扱うのではなく、FileStreamだったのです。

EDIT:C#は通常、「強く型付けされた」(型として)と型セーフです。コンパイラはオブジェクトに対して任意の呼び出しを行なわせることはできません。また、ランタイムは不適切な変換。

安全でないコードがどこに収まるかは完全にはわかりません - 私はそれについて十分には分かりませんが、私は恐れています。

C#4の動的型定義では、上記のように、弱く型付けされていても型保証型のコードが使用できます。 foreachはそれをハイブリッドのようなものを作り、暗黙の型変換を実行することを

注:これは、コンパイルされます

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

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

(そこに最近、この上another questionだった)が、実行時に失敗します。皮肉なことに、の変数に対して、を強く型付けしようとしているからです。つまり、イテレータの結果をキャストする必要があります。

+0

Jonは、C#に関して、plsが(もし時間があれば)ビットを定義/説明することができます。 – Wondering

+0

Hm、 "タイプセーフ"の定義のような音は、実行エンジンが間違ったタイプだと思うデータにアクセスしないことを意味します。私はこれに驚いています。その定義によって、C#のジェネリックスは、exampeのために非ジェネリックArrayListを使用するのと比較して型安全性を追加しないためです。ジェネリックは厳密な型指定だけの例ではあるが、型の安全性の例ではないとお考えですか? – Timwi

+0

@Timwi:CLRはどちらの場合でも型の安全性を提供しますが、より高いレベルで見ることができます: 'ArrayList'から値を抽出した結果をキャストする必要がある場合、そのキャストは失敗する可能性があります。それはかなり安全な方法で失敗しますが、 "リストから文字列値を取得する"という行為は、 'List 'よりも依然として危険です。 –

1

「タイプセーフ」とは、キャスティングが伴わず、実行時エラーが発生しないことを意味します。

「強く型付けされた」とは何も意味も、「それは良い」、「私はそれに慣れている」と主張する人もいます。

「タイプセーフ」は、コードやAPIの一部に関連しています。「厳密に型指定された」とは、言語やプラットフォーム全体を指します。

+0

実際には、型の安全性はコンパイル時に型チェックが実行されることを意味しません。 *どこかで*実行されている限り、それはすべて良いです。 – Noldorin

3

良い質問です。 this Wikipediaのエントリを読んで、ここエキスです:私は並べ替えしようとしている...数週間過ごした」、

ベンジャミン・C・ピアス、タイプ と言語と高度な タイプとプログラミング言語プログラミングの著者は言う 「強く 型付き、」「静的に型付けされた、」「安全」 などの用語うち とは、驚くほど ....これらの用語 の使用量が無駄にほとんど それらをレンダリングするように、様々な困難であるました。「

0

彼らはそれは解釈の問題だ、基本的に同じである:

ウィキペディアから:

Type safety

型の安全性は、多くの定義の一つと同義です。型の安全性と動的型付けは相互に互換性がありますSmalltalkのような動的型付き言語は強く型付けされた言語と見なすことができ、正しいプログラムは適切にタイプされています。動的セマンティクスが適切な意味で「間違っている」ことがない限り、それは上記の定義を満たし、型安全と呼ぶことができます。

0

ype safeは、プログラムがオブジェクトのパブリックプロパティの境界外のメモリにアクセスするのを防ぐことを意味します。コードが型安全でない場合、望ましくない副作用が発生する可能性があります。タイプセーフティは、アセンブリの分離とセキュリティの実施に重要です。コードが型に安全な場合、共通言語ランタイムはアセンブリを互いに完全に分離できます

関連する問題