Microsoft MVP성태의 닷넷 이야기
const와 readonly의 명확한 차이가 이게 맞나요? [링크 복사], [링크+제목 복사],
조회: 12091
글쓴 사람
김민아
홈페이지
첨부 파일
 

제가 알고있는 차이로는

1. const는 정적 취급이고 readonly는 인스턴스 취급이다. (readonly에 static을 선언하면 정적 취급)
2. const는 변수 선언과 동시에 값을 할당해야 하지만 readonly는 선언만 해놓은 후 생성자 내부에서 값을 몇 번이고 바꿀 수 있다.
3. const는 기본 자료형(int, string, enum)에 대해서만 사용할 수 있고 readonly는 모든 타입으로 사용할 수 있다.
4. const는 메소드 내부에서도 선언할 수 있는데 메소드에서 지역변수로 사용하게 되면 스택 메모리에 할당되며 클래스 필드로 사용하게 되면 힙에 할당된다.

그리고 정말 죄송하지만 부가적인 질문 하나가 더 있는데..
구조체 필드로써 선언한 값 형식은 스택, 참조 형식은 참조가 스택에 있고 그 주소를 찍고 들어가 보면 힙메모리에 객체가 저장되어 있는 건 알겠는데
구조체에서 const로 선언한 값 형식의 필드도 스택에 올라가는 게 맞나요..?








[최초 등록일: ]
[최종 수정일: 3/9/2022]


비밀번호

댓글 작성자
 



2022-03-09 12시59분
4번의 경우 const 지역 상수는 스택 메모리에 할당되지 않습니다. 또한 클래스 필드로 사용해도 힙에 할당되지 않습니다. 마찬가지로 구조체에서 const로 선언한 경우 스택에 올라가지 않습니다.

참고로, 이런 식의 궁금증들은 .NET Reflector나 ildasm.exe 등을 이용해 C# 컴파일러가 IL 코드로 어떻게 변환하는지 살펴 보시면 됩니다. 가령, 4번 질문의 경우, const를 지역 (변수가 아닌) 상수로 정의해도 C# 컴파일러가 출력한 DLL/EXE를 IL 코드 수준에서 보면 const 정의가 누락되는 것을 볼 수 있습니다.

또한, const로 정의한 필드가 구조체든 클래스든 개별 인스턴스의 메모리에 올라오지 않는 것은, 해당 필드를 IL 코드로 보면 static으로 정의되는 것을 통해 유추할 수 있습니다.
정성태
2022-03-09 01시33분
[김민아] 늦은 시간에 정말 감사합니다 앞으로 리플렉터로 변환 과정을 확인해 봐야겠네요!!
[guest]

1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5836박지범2/27/202310142static instance의 initialize 순서가 보장되나요? [6]
5835주민호2/25/202317194Windows Software Development Kit - 최신버전 1개 남기고 다 삭제하면 안되는지요? [10]파일 다운로드1
5834guest2/24/202310221Python IDE - 비주얼스튜디오 [3]
5833무지남2/23/20239515Async 메서드 그리고 나서 Bool 메서드 [5]
5832김지우2/21/202310201event와 delegate의 차이 , event를 써야하는 이유 [1]
5831이우람2/20/202311226ref 전역변수가 pinned가 될수 있나요? [2]
5830냉수마찰2/19/202310583C# GridView에 Column별 데이터 추가하는 방법에 대해 [1]
5829수박942/19/202311919키움 API를 윈폼과 WPF의 네임스페이스 없이 콘솔이나 WinUI3에서 사용할 수 있는 방법이 있나요? [2]파일 다운로드1
5828김재영2/19/202311043장기적으로는 this 구문을 안쓰는게 맞을까요? [2]
5827lee2/18/202312393파이썬 설치 오류 질문입니다 [1]
5826Syong2/14/202312304Socket 관련 Leak (OverlappedAsyncResult, OverlappedData) 관련 문의 [7]파일 다운로드1
5825박성원2/14/202311583Listview 컨트롤의 화면 전환 시 갱신 속도 [1]
5823검은콩2/13/202313918catch(Exception ex)의 line번호를 쉽게 알 수 없는지요? [7]
5822김지우2/11/202313482책을 보면서 sync, async 이해가 되지 않는 부분이 있습니다. [5]파일 다운로드2
5821검은콩2/9/202310749Async 신뢰성과 소켓데이터 [4]
5820차가워2/8/202310583다른 프로세스 실행 후 포커스 가져오기 [3]
5819취준생2/7/202310973WPF 관련 실무가 궁금합니다. [3]
5818윤길2/7/202310079ObservableCollection 에서 INotifyPropertyChanged 구현해야하나요? [2]
5817흰털너부리2/7/20239899배포 시 winform 실행 콘솔로그 보는 방법 [1]
5816흰털너부리2/6/202310066.net core json array validation 질문 드립니다. [1]
5815김재영2/6/202310013종단간 암호화에 대해 시나리오인데 타당한 시나리오일까요? [2]
5814한예지 donator2/6/202311057decompile? [9]
5813김재영2/5/202311165openssl genrsa 2048시 키 생성이 다르게 됩니다. - 파일첨부 [4]파일 다운로드1
5812김재영2/5/202311519openssl genrsa 2048시 키 생성이 다르게 됩니다. [2]
5811치르바2/3/202311169MiniDumpWriteDump API로 덤프수집을 했는데요.. [3]
5810이건우1/31/202311795윈도우서비스를 통한 웹통신관련 질문입니다 [3]
1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...