[c#] 읽기 전용 및 가져 오기 전용 속성을 사용해야하는 경우

.NET 응용 프로그램에서 “ReadOnly”속성을 사용해야하는 경우와 “Get”만 사용해야하는 경우 이 둘의 차이점은 무엇입니까?

private readonly double Fuel= 0;

public double FuelConsumption
{
    get
    {
        return Fuel;
    }
}        

또는

private double Fuel= 0;

public double FuelConsumption
{
     get
     {
          return Fuel;
     }
}



답변

getter 만 사용하여 속성을 만들면 클래스 외부에있는 코드에 대해 속성이 읽기 전용이됩니다.

그러나 클래스에서 제공하는 메소드를 사용하여 값을 변경할 수 있습니다.

public class FuelConsumption {
    private double fuel;
    public double Fuel
    {
        get { return this.fuel; }
    }
    public void FillFuelTank(double amount)
    {
        this.fuel += amount;
    }
}

public static void Main()
{
    FuelConsumption f = new FuelConsumption();

    double a;
    a = f.Fuel; // Will work
    f.Fuel = a; // Does not compile

    f.FillFuelTank(10); // Value is changed from the method's code
}

클래스의 private 필드 readonly를로 설정하면 필드 값을 한 번만 설정할 수 있습니다 (인라인 할당 또는 클래스 생성자 사용). 나중에 변경할 수 없습니다.

public class ReadOnlyFields {
    private readonly double a = 2.0;
    private readonly double b;

    public ReadOnlyFields()
    {
        this.b = 4.0;
    }
}

readonly 클래스 필드는 클래스 생성 중에 초기화되는 변수에 자주 사용되며 나중에 변경되지 않습니다.

간단히 말해서, 속성 값이 외부에서 변경되지 않도록해야 하지만 클래스 코드 내부에서 변경할 수 있어야하는 경우 “Get-only”속성을 사용하십시오.

초기 값이 설정되면 변경되지 않는 값을 저장해야하는 경우 readonly필드를 사용하십시오 .


답변

C # 6 부터는 ‘읽기 전용 자동 속성’을 한 줄로 선언하고 초기화 할 수 있습니다.

double FuelConsumption { get; } = 2;

생성자에서 값을 설정할 수 있지만 다른 메서드에서는 설정할 수 없습니다.


답변

getter 만있는 속성을 읽기 전용이라고합니다. 속성 값을 변경하기위한 setter가 제공되지 않았기 때문입니다 (외부에서).

C #에는 필드 (속성 아님)에서 사용할 수있는 readonly 키워드 가 있습니다. “읽기 전용”으로 표시된 필드는 객체를 생성하는 동안 (생성자에서) 한 번만 설정할 수 있습니다.

private string _name = "Foo"; // field for property Name;
private bool _enabled = false; // field for property Enabled;

public string Name{ // This is a readonly property.
  get {
    return _name;
  }
}

public bool Enabled{ // This is a read- and writeable property.
  get{
    return _enabled;
  }
  set{
    _enabled = value;
  }
} 


답변

읽기 전용 속성은 오류 방지 코드를 만드는 데 사용됩니다. 속성 및 지원 필드에 대한 Mark Seemann의 캡슐화 게시물 시리즈를 정말 좋아합니다.

http://blog.ploeh.dk/2011/05/24/PokayokeDesignFromSmellToFragrance.aspx

Mark의 예에서 발췌 :

public class Fragrance : IFragrance
{
    private readonly string name;

    public Fragrance(string name)
    {
        if (name == null)
        {
            throw new ArgumentNullException("name");
        }

        this.name = name;
    }

    public string Spread()
    {
        return this.name;
    }
}

이 예에서는 읽기 전용 이름 필드를 사용하여 불변 클래스가 항상 유효한지 확인합니다. 이 경우 클래스 작성자는 이름 필드가 한 번만 설정되고 (불변) 항상 존재하는지 확인하려고했습니다.


답변

메서드는 값을 반환하기 위해 어떤 일이 발생해야한다고 제안하고 속성은 값이 이미 존재한다고 제안합니다. 이것은 경험 법칙입니다. 때로는 약간의 작업을 수행하는 속성 (예 :)을 원할 수도 Count있지만 일반적으로 결정하는 데 유용한 방법입니다.


답변