2010-06-13 2 views
18

는 :이 필드가 비공개로 선언되고 읽기 전용 인 이유는 무엇입니까? 다음 코드에서

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, 누군가는이 방법을 제안했다. 내 질문은 왜 IHtmlDownloader 변수가 읽기 전용입니까?

답변

29

개인용이고 readonly 인 경우 실수로 해당 클래스의 다른 부분에서 실수로 초기화 할 수 없다는 이점이 있습니다. readonly 수정자는 필드 초기화 또는 클래스 생성자에서 값을 제공 할 수 있음을 보장합니다.

초기화 후 기능적으로 변경해서는 안되는 것이 있으면이를 적용하기 위해 사용 가능한 언어 구문을 사용하는 것이 좋습니다.

+2

빙고. 읽기 전용 인 경우 객체 초기화 또는 생성자에서만 설정할 수 있습니다. 필요하지는 않지만 코드 품질의 일부로 오류가 발생할 수있는 범위가 제한됩니다. –

+0

Eric의 대답은 좋았지 만 Cylon이 초기화 및 생성자에서 읽기 전용 필드 만 변경할 수 있다고 말할 때까지는 의미가 없습니다. 고마워요! –

+2

컴파일러와 JITter가 생성 후 값이 고정된다는 것을 알고 특정 최적화를 수행 할 수 있다는 추가 이점이 있습니다. –

4

이렇게하면 _downloader의 값은 생성자가 실행 된 후에 변경되지 않습니다. readonly으로 표시된 필드는 클래스의 생성자 내에서만 값을 할당 할 수 있습니다.

0

읽기 전용 필드는 초기화 된 후에 변경해서는 안되는 데이터를 모델링하는 데 유용합니다. 선언 자나 생성자에서 이니셜 라이저를 사용하여 읽기 전용 필드에 값을 할당 할 수 있지만 그 후에는 변경할 수 없습니다.

관련 문제