Do "loại an toàn" và "gõ mạnh" có nghĩa là giống nhau không?"Loại an toàn" và "gõ mạnh" có nghĩa là giống nhau không?
Trả lời
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.
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
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
@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
"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.
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
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 ."
Họ là về cơ bản giống nhau, nó chỉ là một vấn đề giải thích:
Từ wikipedia:
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.
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
- 1. Có an toàn khi sử dụng GetHashCode để so sánh các loại Anonymous giống nhau không?
- 2. MongoDB/Java: Gõ an toàn trong DBObjects
- 3. Sự khác nhau giữa đề an toàn và an toàn
- 4. Có an toàn khi đúc các giá trị tùy ý của loại cơ bản cho loại enum mạnh mẽ không?
- 5. An toàn loại an toàn()
- 6. "Nhập an toàn" có nghĩa là gì trong Python?
- 7. Loại an toàn trong .net là gì?
- 8. Nâng và loại an toàn
- 9. Danh sách Array có an toàn hoặc được đánh máy mạnh không?
- 10. Đối tượng 'an toàn chủ đề' có nghĩa là gì?
- 11. Tôi có thể có sự an toàn và sự kiện ngoại lệ mạnh không?
- 12. Mã an toàn và không an toàn
- 13. mạnh dữ liệu gõ lỗi
- 14. IDisposable, ObjectDisposedException, và các loại an toàn
- 15. là chuỗi java.util.UUID có an toàn không?
- 16. Mảng an toàn không có khóa an toàn
- 17. SecureString có an toàn không?
- 18. Loại in an toàn
- 19. FormsAuthentication: Có an toàn không?
- 20. Statemachine và statechart có giống nhau không?
- 21. ClearTimeout và clearInterval có giống nhau không?
- 22. Loại mã của tôi có an toàn không?
- 23. Hình thức này có giống như một loại muối mạnh cho mật khẩu
- 24. Có phải Azure CloudTable là chủ đề an toàn không?
- 25. Loại an toàn, Java Generics và truy vấn
- 26. Báo cáo JSLint "Không an toàn ^" cho regex của tôi - điều đó có nghĩa là gì?
- 27. Tôi có phải là loại trộn an toàn trong danh sách Python không?
- 28. VB.NET gõ nhẹ? mạnh mẽ đánh máy?
- 29. TBytes, TByteDynArray, Mảng Bytes có thể được sắp xếp một cách an toàn với nhau không?
- 30. Trong SignalR là chủ đề Hub.Context có an toàn không?
Đây có phải là wiki cộng đồng không? – Linuxios