1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | using System; public struct MyStruct { public int Width; } public class ListView { MyStruct ms; public MyStruct Size { get { return ms; } set { ms = value; } } } public class MyClass { public MyClass() { ListView lvi; lvi = new ListView(); lvi.Size.Width = 5; // CS1612 } public static void Main() { MyClass mc = new MyClass(); // Keep the console open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } } |
C++에서 C#으로 옮기면서 겪는 백만스물두 가지 정도 고통 중의 하나입니다.
보통 List 안에 구조체 변수를 넣고 돌리는 경우가 종종 있는데, 무려 C#에서는 컴파일 에러가 나는 코드입니다.
이유가 뭐인고 하니 인덱스에서 값 형식을 찾아갈때는 그 개체 자체의 참조변수가 아닌 '복사본'을 얻게 된다는 것.
이 '복사본'은 저장소 위치를 가르키는 것이 아닌 단순한 메소드이기 때문에 인덱스에 저장되진 않는다는 겁니다.
한 마디로 개체참조를 하려고 했더니 헛손가락질을 한다는 것.
'당연한 거 아니야?' 라고 한다면 그런거겠지..만 이게 익숙해진 사람들에겐 의외로 짜증나는 것이거든요 -_-;
생각보다 해결 방법은 많습니다.
1. 구조체 선언 시 접근속성 부여
2. 구조체에 고유한 인스턴스를 만들고, 해당 필드를 수정 후 다음 전체 구조체를 속성에 다시 할당하기 (2중 구조체)
3. 구조체를 클래스로 변경하기 (?)
1 2 3 4 5 6 7 8 9 10 | public MyClass() { //ListView lvi; //lvi = new ListView(); //lvi.Size.Width = 5; // CS1612 MyStruct ms; ms.Width = 5; lvi.Size = ms; } |
그냥 재할당을 해주면 단순히 해결되긴 합니다 ~_~
'Works > Programming' 카테고리의 다른 글
C++) ifstream 읽기 성능 비교 (0) | 2018.08.07 |
---|---|
JAVA) I/O 퍼포먼스 개선 (0) | 2018.08.03 |
안드로이드) NFC 태그 읽기와 쓰기 (0) | 2018.07.24 |
티스토리 홈 화면을 원하는 페이지(포스팅)으로 바꾸기 (0) | 2018.07.11 |
Infix를 Postfix로 바꾸기. (스택 푸시팝 연습) (0) | 2018.07.11 |