C# 13 - (8) 부분 메서드 정의를 속성 및 인덱서에도 확대
partial 예약어의 지원이,
- C# 2.0 - partial 클래스 지원
- C# 3.0 - partial 메서드 지원
- C# 9.0 - partial 메서드 개선 (반환 타입 허용, out 매개변수 허용, 접근 제한자 허용)
속성(property) 및 인덱서(indexer)에도 적용이 가능해졌습니다.
More partial members
; https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-13#more-partial-members
Partial properties ([Proposal]: Partial properties (VS 17.11, .NET 9) #6420)
; https://github.com/dotnet/csharplang/issues/6420
아래는 이에 대한 사용 예를 보여줍니다.
namespace ConsoleApp1;
internal class Program
{
static void Main(string[] args)
{
Device device = new Device { Name = "Device 1" };
Hub hub = new Hub();
hub[0] = device;
Console.WriteLine(hub[0].Name);
}
}
public partial class Device
{
string _name = "";
public partial string Name { get; set; } // partial 속성 선언
}
public partial class Device
{
public partial string Name // partial 속성 정의
{
get => _name;
set => _name = value;
}
}
public partial class Hub
{
Device[] _devices = new Device[10];
public partial Device this[int index] { get; set; } // partial 인덱서 선언
}
public partial class Hub
{
public partial Device this[int index] // partial 인덱서 구현
{
get => _devices[index];
set => _devices[index] = value;
}
}
일반적으로는 이런 식으로 굳이 선언과 구현할 나눌 필요는 없을 것입니다. 하지만 역시나
자동 소스코드 생성기에서는 유용할 텐데요, 실제로
이슈에 실린 소스코드를 보면,
// UserCode.cs
public partial class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChanged]
public partial string UserName { get; set; }
}
// Generated.cs
public partial class ViewModel
{
private string __generated_userName;
public partial string UserName
{
get => __generated_userName;
set
{
if (value != __generated_userName)
{
__generated_userName = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(UserName)));
}
}
}
}
저렇게 partial class 내에 NotifyPropertyChanged 특성을 적용한 partial 속성이라면 자동 소스코드 생성기가 관여해 MVVM 패턴을 위한 코드를 쉽게 추가할 수 있을 것입니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]