본문 바로가기
C#/Effective C#

[Effective c#] Item11 ~ Item13

by 코모's 2022. 7. 8.
반응형
  1. .NET 리소스 관리에 대한 이해
    1. 힙에 관한 메모리 관리는 가비지 콜렉터가 완전히 책임 진다.
    2. 이외에 비관리 리소스는 개발자가 관리해야함
      1. 더보기
        비관리 리소스
        - finalizer와 IDisposable 인터페이스 라는 2개의 메커니즘을 제공
        => finalizer는 객체를 가비지로 판단한 경우 이 객체를 다른 큐에 삽입하여 나중에 finalizer를 호출할 준비만 수행함
    3. 가비지콜렉터의 세대 개념
      1. 0세대 : 수집 절차 이후 생서된 객체들
      2. 1새대 : 두번이상 수집절차에서 살아남은객체들
      3. 수집 절차 ?
        1. 기본적으로 0세대 객체만 검사
        2. 1세대는 대력 10번에 한번 검사
        3. 2세대는 대력 100번에 한번 검사
    4. 비관리 리소스를해제하는 좋은 방법은 IDisposable을 사용하는 것이다.
  2. [Item12] 할당 구문보다 멤버 초기화 구문이 좋다.
    1. 멤버 초기화 ex : private List<string> Labels = new List<string>();
    2. 멤버 초기화구문을 사용하지 않는것이 좋은상황
      1. 객체를 0이나 null로 초기화 하는경우
        1. 기본 시스템 초기화 루틴은 코드를 실행하기 전 모든 값을 0으로 설정한다.
          1. 더보기
            ex)  public struct MyTyp{...}
            MyType myVal1;    //0으로 초기화
            MyType myVal2 = new MyType();    //반복해서 0으로 초기화. 약간의 추가 시간이 소요됨.
        2. 동일한 객체를 반복해서 초기화 하는경우
          1. 더보기
            ex) private List<string> Labels = new List<string>();
            생성자(int size)
            {
                Labels = new List<string>(size);
            }
            //int 변수 하나르 매개변수로 가진생성자가 호출될때 이전 Lables는 즉각 가비지가 된다.
        3. 멤버 초기화 할때 예외처리가 필요한 경우
          1. 멤버 초기화는 try로 감쌀 수 없기 때문에 초기화 과정에서 예외가 발생하면 외부로 전파된다. 이경우 생성자 내로 초기화 구문을옮기고 예외처리를 해야한다.
    3. [Itme13] 정적 클래스 멤버를올바르게 초기화 하라
      1. 정적 멤버가 있다면 인스턴스를 생성하기 전에 반드시 정적 멤버 변수를 초기화 해줘야 함
        1. 정적 생성자 or 정적 멤버 초기화 구문 사용
      2. 정적 생성자는 타입내에 정의된 모든 메소드, 변수, 속성에 최초로 접근하기 전에 호출된다.
      3. 1.정적 초기화 구문
        1. 정적 멤버를 간당하게 초기화 하는 경우라면 정적 생성자보단 정적 초기화 구문으 사용하는것이 간편하다. 
        2. 더보기
          private static readonly Mysingleton theOneAndonly = new MySingleton();
          public static MySingleton TheOnly
          {
              get { return theOneAndOnly;}
          }
          private MySingleton(){}
          //TheOnly를 호출하여 사용
      4. 2. 정적 생성자
        1. 더보기
          private static readonly MySingleton theOnly;
          static MySingleton()
          {
              theOnly = new TheOnly();
          }
          public static Mysingleton TheOnly
          {
              get { return theOnly;}
          }
          private Mysingleton(){}

 

 

 

 

 

참조 - Effective C# <강력한 C# 코드를 구현하는 50가지 전략과 기법, 이펙티브>, 빌 와그너, 김명신, 한빛미디어

 

반응형