Câu trả lời:
Các final
từ khóa có một số tập quán trong Java. Nó tương ứng với cả từ khóa sealed
và readonly
từ khóa trong C #, tùy thuộc vào ngữ cảnh mà nó được sử dụng.
Để ngăn phân lớp (kế thừa từ lớp được xác định):
Java
public final class MyFinalClass {...}
C #
public sealed class MyFinalClass {...}
Ngăn chặn ghi đè một virtual
phương thức.
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
C #
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Như Joachim Sauer chỉ ra, một sự khác biệt đáng chú ý giữa hai ngôn ngữ ở đây là Java theo mặc định đánh dấu tất cả các phương thức không tĩnh là virtual
, trong khi C # đánh dấu chúng là sealed
. Do đó, bạn chỉ cần sử dụng sealed
từ khóa trong C # nếu bạn muốn dừng ghi đè thêm một phương thức đã được đánh dấu rõ ràng virtual
trong lớp cơ sở.
Để chỉ cho phép một biến được gán một lần:
Java
public final double pi = 3.14; // essentially a constant
C #
public readonly double pi = 3.14; // essentially a constant
Là một lưu ý phụ, tác dụng của readonly
từ khóa khác với từ const
khóa ở chỗ readonly
biểu thức được đánh giá trong thời gian chạy thay vì thời gian biên dịch , do đó cho phép các biểu thức tùy ý.
readonly
các biến thành viên có thể được sửa đổi trong các hàm tạo: pastebin.com/AzqzYGiA
Nó phụ thuộc vào ngữ cảnh.
final
lớp hoặc phương thức, tương đương C # làsealed
.final
lĩnh vực, tương đương C # làreadonly
.final
biến cục bộ hoặc tham số phương thức, không có tương đương C # trực tiếp.For a final local variable or method parameter, there's no direct C# equivalent
một sự khác biệt rất lớn.
const
chỉ có thể được sử dụng trên các loại giá trị. Theo như tôi biết thì không có cách nào tạo ra hằng số hiệu quả cho kiểu tham chiếu cục bộ.
Điều mọi người ở đây đang thiếu là sự đảm bảo của Java về việc gán xác định cho các biến thành viên cuối cùng.
Đối với một lớp C có biến thành viên cuối cùng V, mọi đường dẫn thực thi có thể thông qua mọi hàm tạo của C phải gán V chính xác một lần - không gán V hoặc gán V hai lần trở lên sẽ dẫn đến lỗi.
Từ khóa chỉ đọc của C # không có bảo đảm như vậy - trình biên dịch sẽ rất vui khi không để các thành viên chỉ đọc không được chỉ định hoặc cho phép bạn gán chúng nhiều lần trong một hàm tạo.
Vì vậy, cuối cùng và chỉ đọc (ít nhất là đối với các biến thành viên) chắc chắn không tương đương - cuối cùng thì nghiêm ngặt hơn nhiều.
Như đã đề cập, sealed
tương đương với các final
phương thức và các lớp.
Đối với phần còn lại, nó là phức tạp.
Đối với static final
các lĩnh vực, static readonly
là điều gần nhất có thể. Nó cho phép bạn khởi tạo trường tĩnh trong một hàm tạo tĩnh, tương đối giống với trình khởi tạo tĩnh trong Java. Điều này áp dụng cho cả hằng số (nguyên thủy và đối tượng bất biến) và tham chiếu không đổi đến các đối tượng có thể thay đổi.
Công cụ const
sửa đổi khá giống nhau cho các hằng số, nhưng bạn không thể đặt chúng trong một hàm tạo tĩnh.
readonly
có thể được sử dụng. Mặc dù vậy, nó không bằng nhau - final
yêu cầu chính xác một phép gán ngay cả trong hàm tạo hoặc trình khởi tạo.Không có C # tương đương với một final
biến cục bộ mà tôi biết. Nếu bạn đang tự hỏi tại sao mọi người sẽ cần nó: Bạn có thể khai báo một biến trước một if-if, switch-case hoặc như vậy. Bằng cách tuyên bố nó là cuối cùng, bạn thực thi rằng nó được gán nhiều nhất một lần.
Các biến cục bộ Java nói chung được yêu cầu phải được chỉ định ít nhất một lần trước khi chúng được đọc. Trừ khi nhánh nhảy ra trước khi đọc giá trị, một biến cuối cùng được gán chính xác một lần. Tất cả điều này được kiểm tra thời gian biên dịch. Điều này đòi hỏi mã hoạt động tốt với ít lề cho một lỗi.
Tóm lại, C # không có tương đương trực tiếp final
. Mặc dù Java thiếu một số tính năng hay của C #, nhưng đối với tôi, phần lớn là một lập trình viên Java để xem C # không cung cấp tương đương ở đâu.
Lớp cuối cùng của lớp Java và phương thức cuối cùng -> được niêm phong. Biến thành viên Java cuối cùng -> chỉ đọc cho hằng số thời gian chạy, const cho hằng số thời gian biên dịch.
Không tương đương với Chung kết biến đối số và phương thức cuối cùng
Các hằng số C # được khai báo bằng từ khóa const cho các hằng số thời gian biên dịch hoặc từ khóa chỉ đọc cho các hằng số thời gian chạy. Các ngữ nghĩa của hằng là giống nhau trong cả hai ngôn ngữ C # và Java.