C# 7.3 - 자동 구현 속성에 특성 적용 가능(Attribute on backing field)
C# 7.3 (1) - 개선된 문법 4개(Support == and != for tuples, Ref Reassignment, Constraints, Stackalloc initializers)
; https://www.sysnet.pe.kr/2/0/11552
C# 7.3 (2) - 개선된 메서드 선택 규칙 3가지(Improved overload candidates)
; https://www.sysnet.pe.kr/2/0/11553
C# 7.3 (3) - 자동 구현 속성에 특성 적용 가능(Attribute on backing field)
; https://www.sysnet.pe.kr/2/0/11554
C# 7.3 (4) - 사용자 정의 타입에 fixed 적용 가능(Custom fixed)
; https://www.sysnet.pe.kr/2/0/11555
C# 7.3 (5) - 구조체의 고정 크기를 갖는 fixed 배열 필드에 대한 직접 접근 가능(Indexing movable fixed buffers)
; https://www.sysnet.pe.kr/2/0/11556
C# 7.3 (6) - blittable 제네릭 제약(blittable)
; https://www.sysnet.pe.kr/2/0/11558
C# 7.3 (7) - 초기화 식에서 변수 사용 가능(expression variables in initializers)
; https://www.sysnet.pe.kr/2/0/11560
C# 7.2까지, "자동 구현 속성(auto-implemented properties)"에 대해 특성을 추가할 수 있는 방법이 없었습니다.
예를 들어 다음과 같이 "자동 구현 속성"을 가진 타입을 정의한 경우,
// https://github.com/dotnet/csharplang/blob/master/proposals/csharp-7.3/auto-prop-field-attrs.md
[Serializable]
public class Foo
{
public string MySecret { get; set; }
}
C# 컴파일러는 다음과 같은 형식의 코드로 확장을 해 컴파일합니다.
[Serializable]
public class Foo
{
private string MySecret_backingField;
public string MySecret
{
get { return MySecret_backingField; }
set { MySecret_backingField = value; }
}
}
그런데, 경우에 따라 위의 "MySecret_backingField" 필드를 직렬화에서 제외하고 싶을 수 있는데 그렇게 하려면 "자동 구현 속성"을 사용하지 않고 개발자가 다시 코드를 다음과 같이 풀어서 타입을 정의해야 했었습니다.
[Serializable]
public class Foo
{
[NonSerialized]
private string _mySecret;
public string MySecret
{
get { return _mySecret; }
set { _mySecret = value; }
}
}
위와 같이 풀어쓰지 않고 "자동 구현 속성" 코드를 유지하면서 혹시나 하는 마음으로 ^^ 굳이 특성을 지정해보면,
[Serializable]
public class Foo
{
// C# 7.2까지 다음의 특성 부여는 경고 발생
[field: NonSerialized]
public string MySecret { get; set; }
}
비록 컴파일 오류는 발생하지 않지만 경고는 다음과 같이 뜹니다.
warning CS0657: 'field' is not a valid attribute location for this declaration. Valid attribute locations for this declaration are 'property'. All attributes in this block will be ignored.
즉, [field: NonSerialized] 특성이 그냥 무시되었습니다. 하지만 동일한 코드를 C# 7.3 컴파일러부터는 특성을 적용시킨 코드를 생성해 줍니다.
[Serializable]
public class Foo
{
[NonSerialized]
private string MySecret_backingField;
public string MySecret
{
get { return MySecret_backingField; }
set { MySecret_backingField = value; }
}
}
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]