c# long과 double의 메모리 크기

​레퍼런스에 보면 정수형의 크기는 비트로 나와 있고 실수형의 그것은 바이트로 나와 있다. 서로 단위가 다르게 나와 있어서 헷갈릴 수 있는데 long과 double이 차지하는 메모리의 크기는 서로 같다.

c# 인터프로세스 통신 – named pipe

프로세스들 사이에서 대이터를 주고 받아야 할 때가 있다. 예를 들어 이런 경우에 쓸모 있다. ls증권의 api를 이용한 애플리캐이션은 32 비트로만 빌드를 할 수 있다. 32 비트 애플리캐이션은 메모리를 원칙적으로 2gb까지 이용할 수 있으며 변칙적으로 4gb까지도 가능하다. 사실적으로는 3gb 정도까지 쓸 수 있다. 이는 커다란 제약이다. 위의 api로 32 비트 서버 애플리캐이션을 만들고 64 비트 클라이언트…

[c#] const를 쓰면 좋은 점 – static

const로 선언하면 상수가 속한 클래스의 인스턴스를 만들지 않고도 다른 클래스에서 상수를 읽을 수 있다. 위 예제에서 Form2의 인스턴스를 만들든 만들지 않든 상수의 값은 바뀌지 않는다. 따라서 그냥 읽을 수 있게 한 거다. 기술적으로 설명하면 상수는 static으로 선언한 셈이다. 그래서 static으로 선언할 수 없다. 이미 선언되어 있기 때문이다. The static modifier isn’t allowed in a constant…

[c#] 헷갈리는 nested class의 인스턴스

위 코드에서 ChildClass의 인스턴스는 두 개 생긴다. parentClass.ChildClass는 ParentClass parentClass = new()로 parentClass가 만들어질 때 parentClass의 컨스트럭터가 생성하고 childClass는 ChildClass childClass = new(parentClass)로 만들어진다. parentClass.ChildClass와 childClass는 부모 클래스는 parentClass로 같다. 하나의 부모 클래스 아래에 두 개의 서로 다른 자식 클래스들이 있는 거다.

[c#] 멀티 뜨레드에서 lock과 await 같이 쓰기

아래의 코드에서 TestMethod1는 멀티 뜨레드에서 작동한다. 이 메떠드는 다른 뜨레드에서 실행되는 메떠드와 동기화되어야 한다. 그러면서 await도 해야 한다. await를 lock 블록 안에서 쓰면 오류로 처리된다. 만약 await가 긴 시간을 쓴다면 lock이 걸린 다른 뜨레드는 그 시간을 기다려야 하기 때문이다. 이러면 멀티 뜨레드를 쓰는 의미가 줄어든다. 아래의 코드처럼 lock 블록 안에서 네스티드 메떠드를 만들어 await를 쓰면…

[c#] 시간 계산하기 – TimeOnly

DateTime은 날짜와 시간을 모두 값으로 갖고 DateOnly는 날짜만 TimeOnly는 시간만 갖는다. 하루 안에서 시간들을 연산하려면 TimeOnly를 쓰는 게 편하다. TimeOnly를 이용할 때 주의해야 할 게 있다. 아래 코드는 -00:00:01을 반환하지 않는다. Because TimeOnly only represents a 24-hour period, it rolls over forwards or backwards appropriately when adding values supplied to those three methods.How to use the DateOnly…

[c#] async는 멀티 뜨레드가 아니다

synchronous는 ‘순서대로 처리한다’는 뜻이다. 반대말은 앞에 부정 접두사 a가 붙어서 asynchronous다. ‘동시에 처리한다’는 의미다. 멀티 뜨레드를 이용하면 동시 처리를 할 수 있으니 멀티 뜨레드는 asynchornous하다. 그러나 async가 곧 멀티 뜨레드를 이용한다는 건 아니다. async가 멀티 뜨레드와 같은 거라면 굳이 따로 있을 리가 없다. async는 작업을 매인 뜨레드에서 처리하면서 마치 멀티 뜨레드를 이용하는 것처럼 보이게 하는…

[c#] 클래스 리스트를 쉽게 DataGridView에 바인드하기 – ObservableObject

클래스 리스트를 DataGridView에 연결하여 리스트 아이템의 필드가 바뀐 때 후자에 반영되게 하려면 INotifyPropertyChanged.PropertyChanged 이벤트를 써야 한다. 이거는 원칙적으로 클래스의 각 필드에 구현을 해야 한다. 많이 번거롭고 코드도 길어진다. 더 편하게 하려면 클래스 리스트를 쓰지 않고 아예 DataTable을 이용한다. 하지만 이건 클래스 리스트보다 느리다. 변칙적인 방법인데 ObservableObject를 이용하면 클래스 리스트를 이용해서도 쉽게 구현할 수 있다. 이걸…

[c#] task와 lambda expression을 이용한 멀티 뜨레드

전에는 멀티 뜨레드를 이용할 때 thread나 ThreadPool을 이용했지만 요샌 task를 쓴다. task로 새 뜨레드를 만들 땐 run이나 StartNew를 이용한다. 전자가 더 편하고 빠르다. run을 이용하면 새로운 뜨레드로 실행할 메떠드를 그대로 쓸 수 있다. 하지만 람다식을 써야 한다. StartNew로 하려면 대상 메떠드가 패러미터로 object만 받을 수 있다. 이걸 다시 타입캐스트해서 써야 하므로 번거롭다. 지나치게 간결한 건…