내가 log4net에 대한 몇 가지 코드를 검토 중이었고 나는 이것을 보았다.
private static readonly ILog logger = LogManager.GetLogger(typeof(AdminClient));
왜 개인 정적 읽기 전용 있어야 할 것이라고 궁금합니다.
내 이해에서 개인 액세스 메서드 또는 속성을 않으면 변수가 클래스 외부에서 사용할 수 없습니다 것을 의미합니다.
정적 변수는이 파일에서만 범위가 지정됩니다.
읽기 전용은 값에서 읽을 수만 있고 값을 지정할 수 없음을 의미합니다.
그래서 저는이 코드를 작성한 사람을 생각하고 있습니다. 클래스 밖에서 사용되는 것을 원하지 않기 때문에 비공개로 선언 했으므로 파일 외부에서 사용하지 않으려 고합니다. 그러나 get 속성이 있으면 정적으로이 양식이 발생하지 않습니다.
나는 readonly를 이해할 수 있고 값은 읽혀지고 설정되지 않는다고 생각합니다.
조언을 많이 주셔서 감사합니다.
나는 당신이 정적을 오해하고 있다고 생각합니다. 정적이란 "파일 외부에서 사용할 수 없습니다"를 의미하지 않습니다. 정적은 클래스 당 하나씩 있습니다. 이 선언이하는 일은 한 번만 (정적), 클래스에서만 사용할 수있는 (파생 클래스가 아닌) (private) 로거 초기화를 지나칠 때까지 쓸 수없는 로거를 생성합니다 (읽기 전용).
좋은 질문!
정적 않습니다아니정적 키워드는 로거 객체가 인스턴스 변수 대신 클래스 변수라는 것을 의미하므로, 해당 클래스의 다른 객체에서 액세스 할 때도 모두 참조 할 것입니다. 같은 로거 객체
static in c #는 멤버가 클래스와 연결되어 있고 클래스의 인스턴스가 아니라는 것을 의미합니다. 읽기 전용은 C #에서 대부분의 변수와이 변수가 참조 변수이기 때문에 중요합니다. readonly는이 변수가 항상 동일한 로거를 참조 함을 의미합니다.
개발자가 말한 것은이 클래스의 모든 인스턴스에서 logger.Info (...)를 호출 할 때 공통 인스턴스 (정적 인스턴스)를 사용하고자하므로 (클래스 인스턴스마다 새 로거를 만들 필요가 없음) 그들은 생성 된 (읽기 전용) 이후로 변경되지 않았 음을 확신하고 파생 클래스에서 가상 함수에 있다면 실수로 기본 클래스 하나를 사용하지 않도록하고 싶습니다.
에이읽기 전용변수는 그 값이 일생 동안 일정하다는 점에서 const와 매우 흡사합니다. 차이점은 readonly 변수는 런타임에 초기화되고 const는 컴파일 타임에 초기화된다는 것입니다.공전, 평범한 용어로, 변수의 인스턴스가 선언 된 객체의 인스턴스에 의존하지 않는다는 것을 의미합니다. 수명은 함수 호출에서 함수 호출까지 지속됩니다. 정적 변수는 저장 공간이 프로그램의 전체 지속 기간 동안 할당 된 채로 있기 때문에 액세스가 빠릅니다. 그래서 우리는 당신의 질문으로 돌아갈 수 있습니다.
'로거'가 정적 멤버 인 이유는 무엇입니까? 그것은 디자인 결정입니다. 나는 당신이이 질문에 대답하기 위해 그것을 어떻게 사용하고 있는지를 알아야합니다. 왜 읽기 전용입니까? 한 번 초기화되고 인스턴스가 전체적으로 사용 된 것처럼 보입니다. Logger를 초기화 한 직후에 '읽기 전용'으로 설정하여 Logger의 가치를 아무도 개척하지 못하게 할 수 있습니다.
readonly 플래그를 private 변수에 두는 이유는 변수가 항상 동일한 객체를 참조한다는 것을 선언하기 위해서입니다. 비공개가되면 클래스 외부의 누구도 볼 수 없게되지만이 방법을 사용하면 실수로 변수를 새 객체로 덮어 쓰지 않도록 할 수 있습니다.
logger = LogManager.GetLogger(typeof(AdminClient));
우리 수업의 다른 곳. 읽기 전용으로는 컴파일되지 않을 것입니다 (전에 초기화되지 않았다면,과우리는 (정적 인) 생성자에있다.
정적 변수는 "클래스 변수"의 범주에 속하며, 클래스 변수는 클래스 객체 대신 클래스와 연관되는 변수이며 인스턴스 변수는 클래스 객체와 결합되는 변수입니다. 클래스 객체가 초기화 될 때마다이를 의미합니다. 정적 변수는 링크 된리스트의 크기와 같은 프로그램을 실행하는 클래스의 모든 객체들 사이에서 공유되는 반면에 "인스턴스 변수"(비 정적)의 자체 복사본을 가질 것입니다. readonly는 변수를 읽기 전용으로 만드는 데 사용되는 C #키워드입니다. java는 그런 기능을 제공하지 않습니다. 변수를 액세스하기위한 public 메소드를 작성해야합니다.
미안, 나는 이것이 이미 답변되었고 정말로 오래되었다는 것을 알고있다. 그러나 나는이 기사를 가로막는 누군가가 이것이 당신이 "하나씩 일어나는 것"질문.이 질문의 코드 예제에 대해 더 알고 싶은 사람은 Singleton과 그 사용 방법 (중재자, 로거, 비동기 콜백 등)에 대해 더 많은 것을 배우면 도움이 될 것입니다.
// 싱글 톤에 대한 모선 (mothership)
http://msdn.microsoft.com/en-us/library/ff650316.aspx
http://msdn.microsoft.com/en-us/library/ff650849.aspx
// 그들에 대한 위대한 SO 토론
싱글 톤 (singleton)에 대해 그렇게 나쁜 점은 무엇입니까?
protected static readonly
그게 나에게 "CA2104: 읽기만 가능한 가변 참조 유형을 선언하지 마십시오 " VS 코드 분석에서 경고. 말한 바와 같이이리, "Aprotected readonly
필드가 정말 분명하지 않습니다. 같이protected
파생 클래스가 필드를 초기화 할 수 있다고 기대할 수 있습니다. " 선언 변경private static readonly
이것을 고쳤다. - CrazyPyro