C# 프로퍼티 코딩 스타일에 대한 질문

안녕하세요. :smile:

Visual Studio 오류목록 메시지에 자주 뜨는 서식 수정에 대한 질문 드립니다.

image

저는 Visual Studio에서 제안해주는 코드방식을 유심히 보고 배우며 유용하게 이용중입니다.

그런데 getter 서식에 대한 고민이 있습니다.

제가 일반적으로 사용하는 프로퍼티 구조에서 이 서식 수정 제안을 받아들이면 모양이 좀 이상해지는 것 같은데요.

제가 아직 익숙해지지 않아서 그런걸까요? 여러분은 어떻게 생각하시나요.

public int Blue
{
    get { return _blue; }
    set { _blue = value; OnPropertyChanged(); }
}

// Get Set의 부조화..??
public int Green
{
    get => _green;
    set { _blue = value; OnPropertyChanged(); }
}

그리고 기존 set 서식을 대체할만한(get => 서식에 어울리는) 스타일이 있는지도 궁금합니다.

읽어주셔서 감사합니다. :smile:

좋아요 2
   private int _value;
   public int Value => _value;   // 읽기 전용 프로퍼티
   private int _value;
   public int Value { get => _value; set => _value = value; } // 읽기 / 쓰기 프로퍼티

그러나 @james.lee 님이 원하시는 두개의 코드는 블럭 으로 감싸야 하기 때문에,

   private int _value;
   public int Value
   {
      get => _value;
      set => { _value = value; OnPropertyChanged(); }
   }

이렇게 해야만 합니다.

C# 은 버젼 몇 부터 지원했는지는 지금 생각이 안나는데, 메소드 또한,

   int GetValue() => _value;

이런 식으로 쓸 수 있는데요, 함수형 언어의 구문에 영향을 받은것으로 보입니다.

C# 10에는 다음과 같이 별개의 필드를 선언하지 않아도,

   public Value { get => field; set => field = value; }

이렇게 자동 생성되는 필드를 이용할 수 도 있게 됩니다.

글이 길어졌는데, 두개 이상의 코드일 경우 블럭으로 감싸줘야 하므로,

public int Green
{
    get => _green;
    set { _blue = value; OnPropertyChanged(); }
}

이렇게 쓰는게 가장 최신(?)의 코딩 스타일이 되겠군요.

좋아요 4

앗 C# 10.0 정보도 감사합니다.

@dimohy 좋은 답변 감사드립니다.

이제 안이상해보이네요. :smile:

좋아요 2

전 아래와 같이 사용하는데, 이는 BindableBase를 참고한 것 입니다.

BindableBase를 사용할 수 있으면 편하게 SetProperty()를 쓰고 그렇지 못한 경우에는 아래처럼 사용해요.

public class Some : INotifyPropertyChanged
{
	private int _green;

	public int Green
	{
		get => _green;
		set => UpdateProperty(ref _green, value);
	}

	protected void UpdateProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
	{
		if (storage == null)
			throw new ArgumentNullException(nameof(storage));

		if (storage.Equals(value))
			return;

		storage = value;
		OnPropertyChanged(propertyName);
	}

	#region PropertyChange Event
	
	public event PropertyChangedEventHandler PropertyChanged;
	
	protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
	{
		PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
	}
	
	#endregion
}
좋아요 6

@level120 좋은 방법 알려주셔서 감사합니다!! :smiley:

저도 적용해볼 예정인데 사용해보고 후기도 남겨보겠습니다!

좋아요 2

오…데브익스프레스 mvvm 프레임워크에서 BindableBase가 이걸 기반으로 한건가 보군요!! 문법이 똑같네요 ㅎㅎ

좋아요 1