목록게임프로그래밍/C# (13)
bdfgdfg
C++에도 있는거. 멀티쓰레드 환경에서 원자적으로 처리를 위해 사용한다. 내부적으로 다양한 것들이 있지만 중요하다 생각하는 것. Interlocked.CompareExchange 즉 비교와 교환을 원자적으로 처리한다. 밑의 코드가 있다고 생각해보자. void ExpireQuest() { if(Quest.bAlive == true) { Quest.bAlive = false; } } 어떤 퀘스트가 있고, 퀘스트 객체는 만료날짜를 넘어갔기에 해당 퀘스트를 닫아줘야 하는 코드. 만약 멀티쓰레드 환경에서 저 코드가 실행된다고 보자. A,B쓰레드가 있고 A와 B쓰레드는 저 Quest라는 객체에 동시에 접근하는 상황. A쓰레드는 if문의 Quest.bAlive가 true인것을 확인하고 해당 Quest의 멤버인 bAl..
Linq는 마치 SQL문법처럼 사용가능한 문법. 코드를 여러 단계에 걸쳐서 작성해야할 것을 한줄로 표현가능한 등 굉장히 편리한 이점이 있다. 최근에 List 컬렉션의 요소에 중복된 요소가 있고. 해당 각 중복된 요소의 수를 구해 중복된 수가 높은 요소를 N개만큼 뽑아와야 하는일이 존재했다. 물론 좀 더 처리해야 할 로직은 존재했지만 중요한건 이것이었음. 여기서 Groupby 문법(간단하게 그룹화,중복제거라고 보면된다)을 쓰면 깔끔하게 처리가 가능. class Program { static void Main(string[] args) { var lstOverlappedElementInList = new List() { 1, 1, 3, 3, 3, 5, 9, 9, 15, 15, 15, 15, 4, 4, 50,..
프로그램이 어떠한 문제로 인해 프로그래머의 의도대로 흘러가지 않는 사건을 예외. 이러한 예외를 오류로 이어지지 않도록 적절하게 처리하는 것을 예외 처리(Exception Handling)이라 한다. 간단하게, 크기가 3인 배열을 할당하고, 할당된 메모리의 크기를 넘어서서 접근하는 코드를 만들어보자. -> 버퍼 오버플로우 인덱스가 배열의 범위를 벗어나 에러가 발생. 심지어 실행을 해보면 CLR이 직접 에러 메시지를 로그로 남겨준다. 이렇게 잘못된 인덱스를 통해 배열의 요소에 접근하려 들면 배열 객체가 이 문제에 대한 상세정보를 IndexOutOfRangeException의 객체에 담은 후 Main메소드에 던지고, Main메소드는 이 예외를 처리할 방도가 없기에 다시 CLR에게 던진다. -> CLR에게까지 ..
일반화(제네릭)이란 데이터 형식에 의존되지 않은 것을 의미한다. -> C++의 템플릿과 유사하다. 예로들어 단순하게 static함수에서 배열의 요소를 복사하는 함수 하나를 만들었다고 보자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Program { static void CopyArray(int[] source, int[] target) { for (int push = 0; push