2010-06-13 31 views
18

Trong đoạn mã sau:Tại sao trường này được khai báo là riêng tư và cũng chỉ đọc?

public class MovieRepository : IMovieRepository 
{ 
    private readonly IHtmlDownloader _downloader; 

    public MovieRepository(IHtmlDownloader downloader) 
    { 
     _downloader = downloader; 
    } 

    public Movie FindMovieById(string id) 
    { 
     var idUri = ...build URI...; 

     var html = _downloader.DownloadHtml(idUri); 

     return ...parse ID HTML...; 
    } 

    public Movie FindMovieByTitle(string title) 
    { 
     var titleUri = ...build URI...; 

     var html = _downloader.DownloadHtml(titleUri); 

     return ...parse title HTML...; 
    } 
} 

I asked for something to review my code, và ai đó đề nghị phương pháp này. Câu hỏi của tôi là tại sao biến IHtmlDownloader chỉ đọc?

Trả lời

29

Nếu riêng tư và readonly, lợi ích là bạn không thể vô tình thay đổi từ một phần khác của lớp đó sau khi nó được khởi tạo. Trình sửa đổi readonly đảm bảo trường chỉ có thể được cung cấp một giá trị trong quá trình khởi tạo của nó hoặc trong hàm tạo lớp của nó.

Nếu một số chức năng không nên thay đổi sau khi khởi tạo, bạn nên sử dụng các cấu trúc ngôn ngữ sẵn có để thực thi điều đó.

+2

Bingo. Nếu nó chỉ đọc, nó chỉ có thể được đặt bằng khởi tạo đối tượng hoặc trong hàm tạo. Nó không cần thiết, nhưng một phần của chất lượng mã đang hạn chế phạm vi trong đó một lỗi có thể xảy ra. –

+0

Câu trả lời của Eric là tốt nhưng không có ý nghĩa cho đến khi Cylon nói rằng bạn chỉ có thể thay đổi một trường chỉ đọc trong khởi tạo và khởi tạo. Cảm ơn các bạn! –

+2

Có một lợi ích bổ sung trong đó trình biên dịch và JITter có thể có hiệu lực tối ưu hóa nhất định biết giá trị sẽ được cố định sau khi xây dựng. –

4

Điều này đảm bảo rằng giá trị của _downloader sẽ không bị thay đổi sau khi hàm tạo được thực hiện. Các trường được đánh dấu là readonly chỉ có thể được chỉ định một giá trị từ bên trong (các) hàm tạo của một lớp.

0

Trường chỉ đọc hữu ích cho việc lập mô hình dữ liệu không được thay đổi sau khi đã được khởi tạo. Bạn có thể gán một giá trị cho một trường chỉ đọc bằng cách sử dụng một trình khởi tạo khi bạn khai báo nó hoặc trong một hàm tạo, nhưng sau đó bạn không thể thay đổi nó.

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