2009-06-09 28 views

Trả lời

25

Không, không nhất thiết - mặc dù nó phụ thuộc vào định nghĩa của bạn về các điều khoản và không có định nghĩa rất rõ ràng và được chấp nhận rộng rãi.

Ví dụ: ngôn ngữ lập trình động thường được nhập an toàn nhưng không được nhập mạnh. Nói cách khác, không có thông tin kiểu thời gian biên dịch xác định những gì bạn có thể và không thể làm với một kiểu, nhưng tại thời gian thực thi, thời gian chạy đảm bảo bạn không sử dụng một kiểu như thể nó là một kiểu khác.

Ví dụ, trong C# 4.0, bạn có thể làm:

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! 

Dòng cuối cùng là chìa khóa để nó là kiểu an: không có chuyển đổi an toàn từ một mảng int để một FileStream, vì vậy hoạt động không thành công - thay vì xử lý các byte của đối tượng mảng như thể chúng là FileStream.

CHỈNH SỬA: C# thông thường là "gõ mạnh" (làm ngôn ngữ) và nhập an toàn: trình biên dịch sẽ không cho phép bạn thực hiện cuộc gọi tùy ý trên đối tượng và thời gian chạy sẽ không cho phép bạn thực hiện chuyển đổi không phù hợp .

Tôi không hoàn toàn chắc chắn nơi mã không an toàn vừa với - Tôi không biết đủ để nhận xét, tôi sợ.

Nhập động trong C# 4 cho phép gõ nhẹ nhưng vẫn gõ mã an toàn, như được hiển thị ở trên.

Lưu ý rằng foreach thực hiện một chuyển đổi ngầm, làm cho nó một loại hybrid:

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

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

này sẽ biên dịch (đã có another question về vấn đề này thời gian gần đây) nhưng sẽ thất bại ở thời gian thực hiện. Trớ trêu thay, đó là vì bạn đang cố gắng để được nhập mạnh mẽ liên quan đến biến số stream, điều đó có nghĩa là bạn phải thực hiện một phép diễn trên kết quả của trình lặp.

+0

Jon, u có thể xác định/giải thích một chút (nếu u có thời gian) đối với C#. – Wondering

+0

Hm, có vẻ như định nghĩa “an toàn kiểu” của bạn đơn giản nghĩa là công cụ thực thi sẽ không truy cập được một mẩu dữ liệu cho rằng đó là loại sai. Tôi ngạc nhiên về điều này, bởi vì theo định nghĩa đó, C# generics không thêm bất kỳ loại an toàn nào so với việc sử dụng ArrayList không chung chung, cho exampe. Bạn có nói rằng generics là một ví dụ duy nhất của gõ mạnh mẽ, nhưng không phải loại an toàn? – Timwi

+0

@Timwi: CLR cung cấp sự an toàn kiểu trong cả hai trường hợp, nhưng bạn có thể xem nó ở mức cao hơn: nếu tôi phải đưa kết quả trích xuất một giá trị từ 'ArrayList', thì phép đúc đó có thể thất bại. Nó sẽ thất bại một cách khá an toàn, nhưng hành động "lấy giá trị chuỗi từ danh sách" vẫn còn nguy hiểm hơn nó sẽ là với một 'Danh sách '. –

1

"Loại an toàn" nghĩa là không có quá trình truyền liên quan và không xảy ra lỗi loại thời gian chạy.

Một số người cho rằng "Được đánh máy mạnh" nghĩa là không có gì hoặc "tốt" hoặc "tôi cảm thấy thoải mái với nó".

Dù sao, "Loại an toàn" có liên quan đến một phần mã hoặc API, khi "Nhập mạnh" đề cập đến toàn bộ ngôn ngữ hoặc nền tảng.

+0

Thực ra, nhập an toàn không ngụ ý rằng việc kiểm tra kiểu được thực hiện tại thời gian biên dịch. Miễn là nó được thực hiện * một nơi nào đó *, thì tất cả đều tốt. – Noldorin

3

Câu hỏi hay. Đọc this nhập wikipedia, đây là một đoạn trích:

Benjamin C. Pierce, tác giả của loại và Ngôn ngữ lập trình và nâng cao loại và Ngôn ngữ lập trình, nói, "Tôi đã dành vài tuần ... cố gắng sắp xếp ra các thuật ngữ của "mạnh mẽ đánh máy", "tĩnh đánh máy", "an toàn", vv, và tìm thấy nó đáng ngạc nhiên khó khăn .... việc sử dụng những thuật ngữ rất khác nhau để làm cho chúng gần như vô dụng ."

0

Họ là về cơ bản giống nhau, nó chỉ là một vấn đề giải thích:

Từ wikipedia:

Type safety:

Loại an toàn đồng nghĩa với một trong nhiều định nghĩa về gõ ngôn ngữ động như Smalltalk có thể được xem như là một ngôn ngữ được đánh máy mạnh mẽ với một hệ thống kiểu rất thuận lợi trong đó bất kỳ cú pháp nào lly chương trình chính xác được đánh máy tốt; miễn là ngữ nghĩa động của nó đảm bảo rằng không có chương trình nào như vậy "đi sai" theo nghĩa thích hợp, nó thỏa mãn định nghĩa trên và có thể được gọi là an toàn kiểu.

0

an toàn ype nghĩa là ngăn chương trình truy cập bộ nhớ ngoài giới hạn của thuộc tính công khai của đối tượng. Khi mã không an toàn kiểu, các tác dụng phụ không mong muốn có thể xảy ra. Loại an toàn là quan trọng cho sự cô lập lắp ráp và thực thi an ninh. Khi mã là loại an toàn, thời gian chạy ngôn ngữ chung có thể cô lập hoàn toàn các cụm từ nhau

Các vấn đề liên quan