STUDY/C#(18)
-
[C#] List.Clear() vs List = null
clear와 null 대입은 그 의미가 다릅니다. clear는 다음에 그 객체를 재사용할 수 있다는 의미가 되고요, null대입은 그 List 자체를 날리겠다는 의미니깐요. List 안에 3000개를 넣었다면 C++로 치자면 vector에 reserve(3000); resize(3000); 을 호출해 준 상황과 유사한 메모리 상태라고 생각됩니다. 여기에 null대입을 하면 GC는 List가 확보하고 있는 메모리와, 그 안의 구성요소 모두를 GC 대상으로 설정하겠죠. Clear를 호출한 경우라면 reserve(3000)은 남아있는 상태에서 capacity는 변동이 없을겁니다. 안의 구성요소들은 GC대상으로 설정될 수 있겠네요. 뿐만 아니라 GC는 즉각적이지 않습니다. 따라서 Clear뒤에 바로 null대입..
2023.01.30 -
[C#] DateTime
게임에서 일일 보상과 같이 특정 시간이 지났을 경우 리셋되는 아이템들이 있는데, 이를 위해 reset time을 지정해둔다. (몇시에 초기화 될건지)var addDay = serverTime 하루가 지난 날짜를 확인하기 위해 addDay를 추가하여 + 해주는 것을 알 수 있다. 하지만 이렇게 직접 넣게되면 문제가 발생한다. 작성일인 10월 31일의 경우 +1일을 하면 32일이 되며 에러가 발생한다. 따라서 직접적으로 넣기보단 다음과 같은 방법이 좋다.var addDay = serverTime AddDays() 함수를 사용하면 위와 같은 경우가 발생할 경우 자동으로 11월 1일로 변환해준다.
2022.10.31 -
[C#] for문에서의 Action()과 클로저(closure)의 개념
for문에서의 Action액션을 만들어두고 특정 이벤트가 발생했을때 실행되도록 하는 경우가 있다. 대표적인 예로 버튼클릭액션이다. 만약 이때 어떤 변수를 넣어줘야 할 경우, 등록하는 순간의 값이 아니라 실제로 실행되는 순간에 변수가 들어간다. Slots[0].ClickAction(() => ShowNavigationPopup(type1, value1));위처럼 확실한 값을 넣을 경우에는 문제가 생기지 않는다. 그런데 아래와 같은 경우에는 어떻게 될까?for (int i = 0; i ShowNavigationPopup()); }의도는 다음과 같을 것이다. 해당 _uiBattlePassRewardSlots[]에 reward_type과 reward_index값을 가진 클릭 액션이 발동되도록 하는것.하지만 이..
2022.10.29 -
시작하세요 C# 9.0 프로그래밍
1장 들어가면서 닷넷 프레임워크 : 마이크로소프트에서 발표한 응용 프로그램 개발 환경으로써 프로세스 가상 머신에 속한다. 가상 머신 CLR은 프로세스가 실행되면 메모리에 함께 실행되고 이는 EXE/DLL(1) 의 내부적으로 존재한다. IL(중간언어) 코드의 결과물을 공유하기 때문에 상호 호출이 가능하다. CIL(Common Intermediate Language) : 공통 중간 언어로 속칭 'IL코드'라 한다. '런타임'이 이해할 수 있는 중간 언어 CLI(Common Language Infrastructure) : 공용 언어 기반구조로 MS가 공개한 공개 규약이다. CTS(공용 타입 시스템), CIL, 메타데이터등을 포함하고 있다. CLR(Common Language Runime) : 공용 언어 런타임..
2022.07.06 -
C# 해시테이블 vs 딕셔너리 [hashtable vs dictionary]
C#에서는 key와, value를 사용해서 자료를 저장하는 타입이 2가지가 있다. 해시테이블과 딕셔너리인데 사용법은 거의 동일하지만 내부적으로 처리하는 기술이 다르다. [해쉬테이블 (hashtable)] Non-Generic key와 value 모두 Object를 입력 받는다. 박싱/언박싱을 사용한다. 존재하지 않는 키를 찾으려고 하면 null을 반환한다. 즉, 제네릭을 이용하지 않고 Object를 사용하기 때문에 모든 데이터 타입을 다 받고 처리할 수 있는 장점이 있지만, 자료의 입력에 내부적으로 박싱이 일너라고 사용하는 곳에서도 다시 언박싱을 해줘야 사용이 가능하다. [딕셔너리 (dictionary)] Generic key와 value 모두 선언시 타입을 입력해줘야한다. 박싱/안박싱이 일어나지 않는다..
2022.07.04 -
Delegate
[Delegate] *델리게이트(Delegate) 번역해보면 '대리자' 라는 의미를 가지고 있다. 말 그대로 무엇인가를 대신할 수 있는 역할을 한다. 델리게이트를 사용하는 이유 만약에 클래스a와 클래스b의 메서드를 호출한다고 생각해보자(혹은 그반대여도). 그러면 a가 b를 참조할 것이고, b에서 a를 참조하는 경우도 생길 수 있다. 즉, 쌍방으로 참조가 생길 수 있다. 하지만 델리게이트는 그러한 쌍방 참조를 끊어낸다. a가 b의 메서드를 델리게이트로 호출한다면 a는 b에 대한 참조를 생기겠지만 b는 a를 모른다. 그래서 무엇을 대신하는 대리자인가. 델리게이트는 메서드를 대신해주는데 메서드의 반환형, 매개 변수 종류와 개수가 모두 일치해야 한다. 델리게이트가 메서드를 대신해준다는건 알겠는데 "메서드를 그냥..
2022.07.01