2010-07-27 40 views
16

Những tuyên bố này có ý nghĩa giống nhau không?
Có sự khác biệt nào giữa chỉ đọc và {get; }

int x { get; } 
readonly int x; 
+0

bạn không phải viết "int x {get; private set;}"? – jgauffin

+1

@jgauffin: Không phải nếu mã nằm trong giao diện. –

+3

Tôi khá chắc chắn bạn không thể có nghĩa đen 'int x {get; } '(như là một thuộc tính tự động), vì không có cách nào để thiết lập nó hoặc có nó làm bất cứ điều gì cả. Nó sẽ phải là 'int m_x; int x {get {return m_x; }} '. –

Trả lời

23

Trong câu trả lời cho câu hỏi của bạn: Có một sự khác biệt giữa readonly và {get; }:

Trong int x { get; } (mà sẽ không biên dịch như không có cách nào để thiết lập x - Tôi nghĩ rằng bạn cần public int x { get; private set; }) mã của bạn có thể tiếp tục thay đổi x

Trong readonly int x;, x được khởi tạo hoặc trong một constructor hoặc inline và sau đó không bao giờ có thể thay đổi.

+4

với chỉ đọc x chỉ có thể được đặt trong hàm tạo hoặc trong dòng . –

+2

Có thể muốn làm rõ rằng Không có 'Các câu lệnh này có ý nghĩa giống nhau', nhưng Có với 'Có sự khác biệt giữa chỉ đọc và {get; } '. Có thể tiêu đề hoặc văn bản nội tuyến phải được thay đổi để làm cho nó ít khó hiểu hơn. – SwDevMan81

+1

'readonly' quan trọng của nó để hiểu rằng nó chỉ có thể được khởi tạo trong một hàm tạo. –

11

readonly int x; khai báo trường chỉ đọc trên một lớp. Trường này chỉ có thể được gán trong một hàm tạo và giá trị của nó không thể thay đổi trong suốt vòng đời của lớp.

int x { get; } tuyên bố thuộc tính được tự động chỉ đọc và ở dạng này, không hợp lệ (vì bạn không có cách nào để đặt giá trị). Một thuộc tính readonly bình thường không đảm bảo trả về cùng một giá trị mỗi khi nó được gọi. Giá trị có thể thay đổi trong suốt vòng đời của lớp. Ví dụ:

public int RandomNumber 
{ 
    get { return new Random().Next(100); } 
} 

Điều này sẽ trả lại số khác mỗi lần bạn gọi. (Vâng, đây là sự lạm dụng tài sản khủng khiếp).

-1

Theo nghĩa đen, không có sự khác biệt lớn bởi vì bạn đã khai báo x là riêng tư (mặc định). Bạn luôn có thể biên dịch lại lớp học của mình để tạo x khác biệt.

Tuy nhiên, nếu đó là công cộng, định nghĩa public int x { get; } cho phép bạn sau mở rộng nghĩa để một cái gì đó như thế này:

int x { get { 
    return DoSomeOperation(); 
    } 
} 

Bạn có thể làm điều đó mà không vi phạm khách hàng của bạn. Việc thực hiện getter là private và client gọi nó mà không biết nếu nó là một giá trị tĩnh hoặc có một hoạt động bên trong accessor get của nó.

+0

OP là sự khác biệt giữa' readonly' và thuộc tính chỉ với getter. –

4

Không, các câu lệnh không có nghĩa giống nhau. Các phiên bản đầy đủ của bất động sản sẽ có một biến sự ủng hộ:

private int _x; 

public int X 
{ 
    get { return _x; } 
} 

Một phương pháp trong lớp có thể sửa đổi biến sự ủng hộ, thay đổi giá trị của tài sản:

private void SomeMethod(int someValue) 
{ 
    _x = someValue * 5; 
} 

Từ khóa readonly chỉ cho phép một biến thành viên được chỉ định trong khai báo của nó hoặc trong hàm khởi tạo:

// Both of these compile 

private readonly int _x = 1; 

public SomeClass() 
{ 
    _x = 5; 
} 

// This will not compile 

private void SomeMethod(int someValue) 
{ 
    _x = someValue * 5; 
} 

Vì vậy, một thuộc tính chỉ có thuộc tính là biến số hậu cần là get. được đánh dấu là readonly là thuộc tính chỉ đọc thực sự.

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