2012-04-16 4 views
10

Có ai vui lòng cho tôi biết lý do sử dụng sau đây sealed không biên dịch không? Trong khi đó, nếu tôi thay thế sealed bằng final và biên dịch nó dưới dạng Java, nó hoạt động.C# kín và Java cuối cùng

private sealed int compInt = 100; 
public bool check(int someInt) 
{ 
    if (someInt > compInt) 
    { 
     return true; 
    } 
    return false; 
} 
+0

http://stackoverflow.com/questions/2069010/is-there-any-functional-difference-between-c-sharp-sealed-and-javas-final-keywo –

+0

Tương đương với 'final' cho các thành viên trong C# là' readonly'. –

Trả lời

45

Đó là bởi vì final trong Java có nghĩa là rất nhiều thứ khác nhau tùy thuộc vào nơi bạn sử dụng nó trong khi sealed trong C# áp dụng chỉ đến các lớp học và các thành viên có khả năng ảo (phương pháp, tài sản, sự kiện).

Trong Java final có thể được áp dụng cho:

  • lớp, có nghĩa là các lớp không thể được thừa hưởng. Điều này tương đương với số sealed của C#.
  • phương thức, điều đó có nghĩa là phương thức không thể bị ghi đè trong lớp dẫn xuất. Đây là mặc định trong C#, trừ khi bạn khai báo một phương thức là virtual và trong một lớp dẫn xuất, điều này có thể được ngăn chặn cho các lớp dẫn xuất khác với sealed một lần nữa.
  • trườngbiến, có nghĩa là chúng chỉ có thể được khởi tạo một lần. Đối với các trường tương đương trong C# là readonly.
+1

"niêm phong trong C# chỉ áp dụng cho các lớp" - nó không đúng, nó có thể được áp dụng cho các phương thức trong C#. – Maxim

2

Sealed trong C# thể được áp dụng duy nhất một loại tài liệu tham khảo, và có ảnh hưởng đến cây thừa kế.

Trong thực tế loại được đánh dấu là sealed đảm bảo là "lá" cuối cùng trong cây thừa kế, hoặc ngắn gọn, bạn không thể lấy được từ loại được khai báo như là sealed.

public sealed class Child : Base 
{ 
} 

public class AnotherAgain : Child //THIS IS NOT ALLOWED 
{ 
} 

Không thể áp dụng cho thành viên.

2

Câu trả lời của Tigran không sai trong khi Joey có một chút không chính xác.
Trước tiên, bạn có thể xem trang này: What is the equivalent of Java's final in C#?.
từ khóa sealed có thể áp dụng cho class, instance methodproperty nhưng không phải là biến hoặc phương thức của giao diện. Các lớp học với sealed không thể được kế thừa. Khi sealed đưa vào phương pháp, nó phải là override trong công ty. Mỗi structsealed, vì vậy không thể kế thừa struct. Kiểm tra hình ảnh này: sealed usage