목록Language/C# (18)
Coding Memo
3가지 직렬화를 비교해보자. 1. BitConverter를 이용2. Unsafe 코드인 StructureToPtr을 이용하여 메모리 내용을 그대로 이용3. 직접 바이트를 조작속도 비교 C++로 작성된 서버와 C#으로 작성된 클라이언트의 통신에서 패킷 정보 파싱을 위해 PacketHeader라는 구조체를 이용했다. PacketHeader는 unsigned int16 (ushort)의 Id 값과 같은 타입의 Size로 이루어져 있다. C++의 placement new를 이용해서 메모리에 있는 값 그대로 전송하여 C#에서 파싱하는 형태이다. PacketHeader는 다음의 구조이다.[Size, 2 bytes][Id, 2 bytes] C#에서도 위 메모리 순서를 지키면서 다음 구조체를 작성하였다.[StructL..
Summary Web 상에서의 Http, Https를 이용한 req/res의 body의 text를 직렬화/역직렬화할 때, 타입에 유의하자. nullable 타입과 그렇지 않은 타입은 다르게 직렬화/역직렬화 된다. (예를 들어 int? 타입은 "null"값으로 파싱하지만, 단순 int 타입은 0(default) 값이 될 것이다.) nullable 타입은 아예 text로 `null`이라는 값으로 들어온다. 반드시 서버와 클라이언트에서 같은 데이터에 대한 클래스의 멤버 타입들은 특별한 이유가 없다면 동일하게 해주자.C# 8.0 부터 nullable 기능이 도입되었다. 이 Nullable Reference Types를 사용하면 null이 될 수 있는 참조형 변수와 될 수 없는 참조형 변수를 구분할 수 있다. 즉..
Visual Studio에는 실행을 하기위한 Application이 아닌 Class Library로 프로젝트를 빌드를 했을 때 유용한 기능이 있다. (C# 뿐만 아니라 다른 언어에 대해서도 지원한다.) 라이브러리 프로젝트에 담긴 형식에 맞는 주석(xml 형식)을 빌드한 라이브러리 파일을 가져다 사용하는 프로젝트에서도 동일하게 확인할 수 있다. 위 이미지는 라이브러리 프로젝트에서의 코드이다. summary를 작성하고 마우스를 클래스에 올려다 두면 해당 설명이 표시가 된다! (흔히 코드를 작성할 때, 미리 컴파일되어 있는 파일에 있는 프로퍼티나 함수에 대한 설명이 나오는 것이 바로 이런 것이다.) 위와 같은 기능을 컴파일된 라이브러리를 사용하는 다른 프로젝트에서도 동일하게 사용할 수 있다! 먼저 간단하게 주..
Entity Framework에서 데이터 모델 클래스를 작성할 때, Navigation Property (네비게이션 속성)에 virtual 키워드를 붙일 수 있다. virtual 키워드는 Entity Framework가 이 속성(property)를 Lazy Loading 하도록 한다. Lazy Loading은 해당 클래스나 객체를 로드시에 같이 바로 로드되는 것이 아니라, 관련된 데이터가 실제로 필요한 시점에만 데이터베이스로부터 로드하도록 한다. 아래와 같은 모델이 있다고 사정하자. [Table("User")] public class UserDb { [Key] public ulong UserId { get; set; } public string UserName { get; set; } } [Table("..
BitConverter는 .NET에서 제공하는 API로 기본 primitive 타입들의 데이터를 바이트 배열(byte[])로 직렬화하거나 바이트 배열을 역직렬화하는 기능을 제공한다. 제공되는 Primitive Types - Boolean - Char - Double - Int16 (short) - Int32 (int) - int64 (long) - Single (float) - UInt16 (ushort) - UInt32 (uint) - UInt64 (ulong) Note: float형이 Single로 된다는 것을 유의하자. 아래 문서에 자세히 나와 있다. https://learn.microsoft.com/ko-kr/dotnet/api/system.bitconverter?view=net-8.0 BitCo..
C#에서 어떤 타이머를 구현하거나 실행 예약 등을 할 때 Environment.TickCount를 이용할 수 있다. (물론 타이머는 기본적으로 제공하기는 한다. (System.Timers.Timer 등)) https://learn.microsoft.com/en-us/dotnet/api/system.environment.tickcount?view=net-8.0 Environment.TickCount Property (System) Gets the number of milliseconds elapsed since the system started. learn.microsoft.com 기계어로 번역되어 있는 부분이 많이 보이는데 항상 이해을 하지 못할 정도로 제대로 번역이 되어 있지 않은 경우가 많은 것 같다..
"멀티 스레드 환경에서 싱글턴 클래스의 생성자도 동시에 여러 스레드가 접근 할 수 있다는 것을 기억하자." 싱글턴 패턴 사용시에 스레드에 주의해야 한다. 당연하고 또 당연한 말이고 쉽게 찾을 수 있는 에러이기도 하지만 여기에 간단하게 작성해본다. Singleton이란 싱글턴 클래스가 있다고 가정하자. 먼저 내가 겪었던 상황은 다음과 같다. - 싱글턴 클래스가 Only-Read로만 사용되기 때문에 멀티스레드 환경에서의 다른 lock 처리를 해주지 않았다. - 어떤 스레드 하나가 데이터를 받으면 Singleton .Instance.method()를 호출한다. - 바로 위 상황이 아니면 다른 코드에서 이 싱글턴 클래스를 사용하지 않았다. - 이 싱글턴 클래스는 생성자에서 처음이자 마지막으로 콜랙션에 데이터를 ..
TcpClient 및 TcpListener는 Socket을 직접 컨트롤 하지 않고 간단하고 빠르게 서버를 오픈하고 클라이언트로 서버에 연결할 수 있도록 구성되어 있는 기본 클래스이다. https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient?view=net-7.0 TcpClient Class (System.Net.Sockets) Provides client connections for TCP network services. learn.microsoft.com 특징으로는 동기 및 비동기 메서드를 포함하고 있다는 것과 Send와 Receive시에 NetworkStream으로 데이터를 읽고 쓸 수 있다는 점이다. 추가적으로 Client..