Microsoft MVP성태의 닷넷 이야기
dynamic 변수 할당은 도대체 어디에???? [링크 복사], [링크+제목 복사]
조회: 11184
글쓴 사람
이성환 (vactorman at naver.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

 dynamic을 공부하다 이해가 안 되는 부분이 있어서 이렇게 질문 드렸습니다.
 
 public struct People
    {
        public int Age;
    }

    public class Casting
    {
        public People people;

        public string Name;

        public void TestCall()
        {
            dynamic casting = new Casting();
            casting.people.Age = 19;
            casting.Name = "AAA";

            Console.WriteLine(casting.people.Age);
            Console.WriteLine(casting.Name);

            dynamic onePeople = new People();
            onePeople.Age = 20;

            Console.WriteLine(onePeople.Age);
        }
    }
    
뭐 이런 코드가 있다치면

dynamic으로 선언하여 생성한 casting 객체는

casting.people.Age에 값을 할당해도 0을 가리키고 있는데요.

dynamic 형변환 시 박싱이 일어난다고 알고는 있는데요. 이 상황이 이해가 안 갑니다.

dynamic으로 변수를 선언했든 그렇지 않든

일단 new Casting()을 했다면 이 객체는 힙에 생성되었을 것이고

Casting의 멤버인 people 역시 비록 값 형식이기는 하나 클래스 멤버이므로 힙에 생성 되었을 거라고 생각하는데요.
(아니면 People의 멤버인 Age가 초기화 될 때 스택에 생성되는 건가요????)

그렇다면 people에 대해서는 박싱이 일어나지 않는 것이 정상 아닌가요?

혹, 박싱이 일어났다 치면,

casting.people.Age = 19;

이 코드는 누구에게 19를 할당한 건지 이해가 안 갑니다.

박싱이 발생하지 않았을 거라고 예상되는 casting.Name = "AAA"; 는 제대로된 값을 잘 가져오는데

값형식인 클래스 멤버는 박싱 때문에 엉뚱한 값을 가리킨다?
(그럼 내가 할당한 19는 어떻게 가져오나요....;;;)

동일한 변수(casting.people.Age)에 대고 값을 쓰고 읽었는데

쓸 때는 힙에 있는 객체에다 쓰고, 읽을 때는 스택에 있는 객체를 읽는다? 이것도 이해가 안 갑니다.


그런데 더 이상한 건

dynamic onePeople = new People();
onePeople.Age = 20;

이건 또 정상적으로 20을 읽어 온다는 것이지요.

onePeople은 분명 박싱이 일어났을 것이고, onePeople.Age = 20; 이렇게 할당한 다음

정확히 힙에 있는 onePeople.Age을 가져왔다는 얘기로 이해됩니다.


값형식과 참조형식의 할당 위치를 제가 잘못 이해하고 있는건지 마구 혼동스럽습니다.


답변 부탁드리겠습니다. (__);;;


[연관 글]






[최초 등록일: ]
[최종 수정일: 8/2/2012]


비밀번호

댓글 작성자
 



2012-08-04 07시27분
답변 내용이 길어서, ^^ 아래의 글로 별도로 뺐으니 참고하세요.

C# - 클래스 안에 구조체를 포함하는 경우 발생하는 dynamic 키워드의 부작용
; http://www.sysnet.pe.kr/2/0/1323
정성태

... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
1551인디언기...4/16/201511414iisnode에 대해서 글 올리셨던데 질문이 있습니다 [1]
1549김선아4/15/201511864.net framework 4.5와 c++ dll에 관한 질문입니다 [1]
1550김선아4/15/201510271    답변글 [답변]: .net framework 4.5와 c++ dll에 관한 질문입니다 [2]
1547문명식4/3/201512356IWebBrowser Key Event 관련 [2]
1545나종식3/25/201511322internet explorer dns cache flush [2]
1543이용원3/23/201511302hyper-v 질문드려요! [1]
1544이용원3/24/201510451    답변글 한가지만 더 여쭤볼게요! [1]
1541임기성3/20/201517674Microsoft.Office.Core dll관련 문제 [1]
1539펜플3/17/201511033asp.net 질문입니다. [1]
1540113/17/201510995    답변글 [답변]: asp.net 질문입니다. [1]
1538열공합시닷3/13/201511831중계서버 질문드립니다 [1]
1537김재영3/11/201512860asp.net의 빌드 유휴시간 이후의 리빌드 작업을 컨트롤 할 수 있습니까? [2]
1536솔솔3/9/201511308mac address얻으려고 하는데요.. [1]
1535Stud...3/4/201511870C#엔 MFC의 theApp 과 같은 기능을 하는것이 없나요? [3]
1534김동진3/4/201511316C#에서 BHO로 Windows Explorer에서의 동작이 가능할지요 [2]
1533김동현3/3/201511568컴파일 된 프로그램에 코드 삽입(?) 관련입니다. [1]
1532반가워요3/3/201514153C# 소켓연결에 packet송수신... [8]
1531강현수3/2/201512793C# com 등록 시 GUID 변경 관련 문의 [1]
1529김민규2/15/201512719C++ 64bit/32bit [3]파일 다운로드1
1528김개똥2/14/201510217좀 관련없는 질문이지만, 정말 답답하고 찾는데 명확한 해답 찾지못해 질문 올립니다. <Windows 사용자 인증> [1]
1527방문자1/27/201511234System Timer의 Tick에서 Backgroundworker를 호출하면 스레드 문제가 있을까요? [1]
1526황상대1/26/201513068C# 마샬링 관련 질문이 있습니다. [1]
1525Ji-y...1/19/201511681시작하세요 C# 프로그래밍 도서에 관한 질문입니다. [1]
1523임종복12/31/201419057windows 2008 r2에서 ms-sql 2008 서버사용시 tls문제점 [3]
1524임종복1/4/201514003    답변글 [답변]: windows 2008 r2에서 ms-sql 2008 서버사용시 tls문제점 [2]
1521윤대욱12/19/201411534C++ 에서 서버와 클라이언트를 나누어서 구조체 전달에 대해서 궁금합니다. [1]파일 다운로드1
... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...