성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>C# 7.3 - 자동 구현 속성에 특성 적용 가능(Attribute on backing field)</h1> <p> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# 7.3 (1) - 개선된 문법 4개(Support == and != for tuples, Ref Reassignment, Constraints, Stackalloc initializers) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11552'>http://www.sysnet.pe.kr/2/0/11552</a> C# 7.3 (2) - 개선된 메서드 선택 규칙 3가지(Improved overload candidates) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11553'>http://www.sysnet.pe.kr/2/0/11553</a> C# 7.3 (3) - 자동 구현 속성에 특성 적용 가능(Attribute on backing field) ; http://www.sysnet.pe.kr/2/0/11554 C# 7.3 (4) - 사용자 정의 타입에 fixed 적용 가능(Custom fixed) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11555'>http://www.sysnet.pe.kr/2/0/11555</a> C# 7.3 (5) - 구조체의 고정 크기를 갖는 fixed 배열 필드에 대한 직접 접근 가능(Indexing movable fixed buffers) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11556'>http://www.sysnet.pe.kr/2/0/11556</a> C# 7.3 (6) - blittable 제네릭 제약(blittable) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11558'>http://www.sysnet.pe.kr/2/0/11558</a> C# 7.3 (7) - 초기화 식에서 변수 사용 가능(expression variables in initializers) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11560'>http://www.sysnet.pe.kr/2/0/11560</a> </pre> <br /> <hr style='width: 50%' /><br /> <br /> C# 7.2까지, "자동 구현 속성(auto-implemented properties)"에 대해 특성을 추가할 수 있는 방법이 없었습니다.<br /> <br /> 예를 들어 다음과 같이 "자동 구현 속성"을 가진 타입을 정의한 경우,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // <a target='tab' href='https://github.com/dotnet/csharplang/blob/master/proposals/csharp-7.3/auto-prop-field-attrs.md'>https://github.com/dotnet/csharplang/blob/master/proposals/csharp-7.3/auto-prop-field-attrs.md</a> [Serializable] public class Foo { public string MySecret { get; set; } } </pre> <br /> C# 컴파일러는 다음과 같은 형식의 코드로 확장을 해 컴파일합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [Serializable] public class Foo { private string MySecret_backingField; public string MySecret { get { return MySecret_backingField; } set { MySecret_backingField = value; } } } </pre> <br /> 그런데, 경우에 따라 위의 "MySecret_backingField" 필드를 직렬화에서 제외하고 싶을 수 있는데 그렇게 하려면 "자동 구현 속성"을 사용하지 않고 개발자가 다시 코드를 다음과 같이 풀어서 타입을 정의해야 했었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [Serializable] public class Foo { <span style='color: blue; font-weight: bold'>[NonSerialized]</span> private string _mySecret; public string MySecret { get { return _mySecret; } set { _mySecret = value; } } } </pre> <br /> 위와 같이 풀어쓰지 않고 "자동 구현 속성" 코드를 유지하면서 혹시나 하는 마음으로 ^^ 굳이 특성을 지정해보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [Serializable] public class Foo { // C# 7.2까지 다음의 특성 부여는 경고 발생 <span style='color: blue; font-weight: bold'>[field: NonSerialized]</span> public string MySecret { get; set; } } </pre> <br /> 비록 컴파일 오류는 발생하지 않지만 경고는 다음과 같이 뜹니다.<br /> <br /> <pre style='white-space: pre-wrap; margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 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. </pre> <br /> 즉, [field: NonSerialized] 특성이 그냥 무시되었습니다. 하지만 동일한 코드를 C# 7.3 컴파일러부터는 특성을 적용시킨 코드를 생성해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [Serializable] public class Foo { <span style='color: blue; font-weight: bold'>[NonSerialized] private string MySecret_backingField;</span> public string MySecret { get { return MySecret_backingField; } set { MySecret_backingField = value; } } } </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6260
(왼쪽의 숫자를 입력해야 합니다.)