c#

  • [c#] p/invoke – c++ 코드를 c#에서 읽기

    platform invocation services를 줄여서 p/invoke라 한다. 매니지드 코드에서 언매니지드 코드의 구조체 등에 액세스하는 기능이다. 예를 들면 c++로 만든 라이브러리를 c#에서 불러다 쓰는 거다. 별 거 아닌데 이름만 어렵다. 아래의 예제처럼 클래스 안에서 써야 한다.

  • c# 배열은 레퍼런스 타입이다

    배열은 레퍼런스 타입이라서 매개변수로 넘길 때 ref 키워드를 쓰지 않아도 된다. 그러나 이것은 배열을 초기화한 뒤에만 가능하다. 아래의 예제에서는 클래스만 초기화되고 필드인 배열은 초기화되지 않은 상태라서 널로 넘어가며 레퍼런스로서의 기능을 하지 못한다. 즉 주소가 없는 상태이다. 따라서 ref를 붙여 줘야 한다.

  • c++ char*를 c# string으로 변환하기

    ​c++의 char*는 캐릭터 포인터 즉 문자열의 주소다. c#에서는 IntPtr로 받는다. 이걸 다시 문자열로 바꾸려면 아래와 같이 한다. PtrToStringAuto나 PtrToStringUni 아닌 PtrToStringAnsi를 이용하는 것에 유의한다. 복사하는 대상이 언매니지드 안시일 때에는 이걸 쓴다. 메떠드의 이름만 봐서는 복사하는 대상이 아니라 복사된 결과 즉 복사하여 안시 문자열로 만든다는 뜻 같지만 아니다.

  • c# 멱집합 구하는 예제 – linq

    ​어떠한 집합의 원소들로 구성한 집합을 멱집합이라고 한다. 한자로는 羃集合이라고 쓰는데 羃은 ‘덮다’, ‘곱한다’는 뜻이다. 같은 수들을 한 번 곱하면 제곱이라 하고 세 번 이상 곱하면 거듭제곱이라 하며 거듭제곱한 수를 멱수라 한다. 영어로는 power set라 하는데 2^3에서 2를 base라 하고 3을 power라 한다. 이 집합은 왜 이렇게 어려운 이름을 갖게 되었을까? 그 개수가 2를 기본 집합의…

  • c# control.enabled를 false로 한 때 주의할 점

    비주얼 컨트롤의 enabled를 false로 하면 이건 없는 거로 처리된다. 예를 들어 두 개의 버튼들을 겹쳐 놓고 앞의 것을 enabled = false로 해 보자. 앞의 버튼을 클릭하면 이게 enabled 되어 있지 않으므로 아무 반응도 없어야 할 거 같지만 뒤에 가려져 있는 버튼의 클릭 이벤트가 실행된다. 앞의 컨트롤을 뚫고 뒤의 컨트롤을 클릭한 거로 작동한다.