Programming/C# & Unity

Programming/C# & Unity

C# perfmon 샘플 코드

internal class Program { const string CategoryName = "JangHyeong"; const string CounterName = "Test"; static private bool looping = true; // 1초마다 0~99 사이의 값으로 카운터를 남긴다. static void Loop() { var random = new Random(); var counter = new PerformanceCounter(CategoryName, CounterName, false); while (looping) { counter.RawValue = random.Next(100); Thread.Sleep(1000); } } static void Main(string[] args..

Programming/C# & Unity

C# 람다 클로저 원리

개요 C#의 람다식의 사용법과 어떻게 작동하는지 간략하게 정리한다. 람다 int number = 5; // input에 5를 더하여 리턴하는 익명 함수를 담은 변수 action. var action = (int input) => { return number + input; }; // 5 + 10이 리턴되어 15가 출력된다. Console.WriteLine(action(10)); // 출력: 15 위 코드에서 "(int input) => { return number + input; };" 구문을 람다 식이라고 부르며, 함수지만 이름이 없어서 무명 함수(메서드)라고도 부른다. 이때, 익명 함수 외부에서 가져온 변수 number를 캡처된 변수라고 부른다. 그리고 캡처가 완료되어 사용가능한 상태가 된 익명 함수..

Programming/C# & Unity

C# Foreach Closure

C#에서 람다를 사용하여 람다 밖에서 사용 중인 변수를 가져오면(캡처하면) 항상 레퍼런스로 전달되는 것 처럼 처리가 된다. (람다-클로저 관련 원리에 대한 간략한 포스팅) for (int i = 0; i { Thread.Sleep(1000); Console.WriteLine(i); }).Start(); } // 10이 10번 출력됨. 위의 경우에는 하나의 i가 10번 레퍼런스 전달되었고, 1초뒤에 forloop가 전부 끝나서 10이 된 i가 10번 출력되게 된다. 그렇다면 foreach를 사용하면 어떨까? foreach (int i in Enumerable.Range(1, 10)) { new Thread(() => { Thread.Sleep(1000)..

Programming/C# & Unity

C# 박싱

개요 흔히 면접 준비 때 박싱에 대해서 공부하게 된다. 하지만 실무에서는 거의 대부분 고려할 일이 없어서 시간이 지날수록 왜곡된 기억과 함께 여러 오해가 생기게 되었는데 관련해서 정리하려 한다. 박싱에 대하여 Stack에 있던 값을 Heap으로 옮기는 작업. 스택에 있는 값을 Heap으로 옮기면서, Heap에 메모리 할당, 값 복사가 일어나서 느리다. 더 자세한 내용은 구글에 C# 박싱을 검색.... int a = 5; object boxedA = a; Dictinary의 Key로 enum을 사용하면 안 되는가? .Net 4.0부터 Dictinary가 개선되어서 문제가 없어졌다. 이전에는 Dictinary 내부에서 Equal 함수를 사용하는데 이때, Enum 간 Equal 체크 시에 박싱이 일어나는 문제..

Programming/C# & Unity

C# static 멤버 함수

개요 static 멤버 함수를 어떨 때 사용하면 좋은지 공유하기 위하여 포스팅하였다. 일반적인 사용처 class TestClass { private static int initCount = 0; public TestClass() { Interlocked.Increment(ref initCount); } public static void PrintInitCount() { Console.WriteLine(initCount); } } TestClass.PrintInitCount(); 제일 많이 쓰는 방법. 한 클래스의 범 인스턴스적으로 공용하여 쓰는 static 멤버 변수를 외부 클래스에서 사용하거나 해야 할 때 위와 같이 static 멤버 변수를 많이 쓴다. this를 사용하지 않는 멤버 함수 알리기 cla..

Programming/C# & Unity

C# Async Await 원리

개요 전에는 그냥 대충 [Async 함수를 호출하면 ThreadPool에서 Task를 하나 꺼내서 함수를 던져주겠지~]라고 생각했었다. 하지만 현실은 물론 그렇지 않았으며, 내부에서 신기하고 재미있는 일이 일어나고 있어서 포스팅을 남기려 한다. 예제 static class DBExecutor { static public async Task ExecuteDB(string spName, long accountId) { string result; Console.WriteLine($"DB 연결 시작"); await Task.Delay(2000); Console.WriteLine($"{spName} 호출 시작."); await Task.Delay(2000); Console.WriteLine($"{spName} 호..

Programming/C# & Unity

C# Enum Flag

Item에 대한 속성(버리기 가능, 사용 가능, 장착 가능, 강화 가능)을 하나의 변수에다가 담고 싶다. 그럴땐 Enum을 사용하여 Flag 연산을 통해 작업을 하는 것이 편하고 싸다. 이렇게 Enum을 정의하여 나는 포션이라는 타입에다가 Deletable과 Usable 속성을 합쳐서 하나의 변수에 담을 수 있게 되었다. 플래그를 꺼내서 사용할 때에는 위와 같은 방식으로 사용하는게 예쁘다. 여기서 궁금한 내용이 ~0가 뭔가? 싶었는데, 물결표 연산자는 이진수 값을 모두 뒤집은 것. 즉 0의 이진수 값은 00000000..인데 이를 뒤집은 뒤집은 11111111... 이며 값은 -1이다. 그래서 모든 Flag 연산에 or을 걸어도 True를 내뱉을 수 있는 All로써 제격인 값. 다른 방법으로는 Int.M..

Programming/C# & Unity

C# DateTime.Now 속도

개요 개발 중 퍼포먼스 측정을 위하여 소요 시간을 아주 잦게 해야하는 로직이 있었다. 이때 제일 익숙하게 사용하는 DateTime.Now를 사용하면 느리지 않을까 싶어서 알아 보았다. 요약 DateTime.Now > StopWatch > DateTime.UtcNow 순으로 무거우니 빠른 계산은 UtcNow를 사용하고, 정밀 계산이 필요하면 StopWatch를 사용하자. 내용 1. DateTime.UtcNow UtcNow쪽을 살펴보면 단순히 SystemTime을 가져오는 것이 전부 인것으로 보인다. 2. StopWatch StopWatch는 HighResoulution이 켜져있다면 좀 더 무겁고 정밀한 계산을 하고, 그게 아니라면 위의 UtcNow를 사용한다. 하지만 대부분의 경우 QPC가 깔려있어서 QP..

Programming/C# & Unity

C# discards (안쓰는 out var , 안쓰는 tuple 숨기기)

C#에서 Parameter를 Out으로 받지만 호출자는 사용할 필요 없는 경우가 존재한다. public void Main() { string str = "abc"; if (int.TryParse(str, out var intResult) == false) // intResult는 쓸모가 없음. { Console.WriteLine("이것은 int 다."); return; } if (float.TryParse(str, out var floatResult) == false) // floatResult는 쓸모가 없음. { Console.WriteLine("이것은 float 이다."); return; } Console.WriteLine("Parse가 가능하다."); } 위와 같은 경우 intResult나 floa..

Programming/C# & Unity

C# 가비지 컬렉션 루트 오브젝트 (GC root object)

기본적으로 C++ 스마트 포인터는 그냥 ref count를 통해서 간단한 원리로 관리가 된다. 그리고 C#의 GC(Garbage Collection)은 루트 오브젝트에서 끊긴 포인터들을 해제시키고 살아있는 친구들은 세대를 넘겨 자주 체크 하지 않도록 한다고 알려져있다. 여기서 루트 오브젝트가 대체 뭐고 언제 연결되고 끊기는 지 궁금해져서 확인해보았다. (https://www.red-gate.com/simple-talk/development/dotnet-development/understanding-garbage-collection-in-net/) 루트 (rooted reference 라고 부르는 듯) 1. 현재 실행 중인 스레드의 지역 변수는 루트 오브젝트로 간주된다. 2. 정적 변수는 루트 오브젝트로 ..

장형이
'Programming/C# & Unity' 카테고리의 글 목록