c#

  • c# DataGridView 잔기술들 2

    행과 열 고정/해제하기 여러 행/열들의 하나를 고정하면 그 위/왼쪽의 것들까지 고정된다. 고정된 여러 행/열들 가운데 하나를 해제하면 그 아래/오른쪽의 것들까지 해제된다. 칼럼 헤더를 여러 줄로 출력하기 DataGridView.ColumnHeadersDefaultCellSytle.Layout.WrapMode는 작동하지 않는다. 버그 같다. ColumnHeader.Text가 길어서 Column.Width를 벗어나도 그냥 잘린다. ColumnHeader.Text 사이에 줄 바꿈 문자 ‘\n’을 넣으면 여러 줄로 출력된다. 마지막 행으로 스크롤하기 행이 추가되면 그 내용을 보기…

  • c# DataGridView 잔기술들 1

    멀티뜨레드로 셀 값 쓰기 메인 뜨레드에서 DataGridView를 만들고 메인 뜨레드 아닌 뜨레드들에서 DataGridView의 셀 값을 쓸 때에는 델리게이트를 이용하지 않아도 된다. 행을 추가할 때에는 델리게이트를 써야 한다. 아래의 코드는 실행되지 않는다.

  • c# 메떠드 아규먼트로 밸류/레퍼런스 타입을 쓸 때의 차이

    세 경우로 나눌 수 있다. 먼저 용어들을 정리한다. 호출을 하는 것은 caller이고 호출되는 것은 callee이다. 들어가는 값은 argument이고 인자라고도 한다. 받는 값은 parameter이고 매개변수라고도 한다. 한자어가 더 어렵게 느껴져서 그냥 영어를 쓴다. 패러미터를 수정해도 아규먼트가 변경되지 않는 경우 밸류 타입 아규먼트를 그냥 넘긴 경우다. 메떠드가 호출되면 아규먼트를 패러미터로 복사하여 이들 둘은 서로 다른 게 된다….

  • c# WndProc으로 윈도우즈 메시지 제어하기

    WndProc 메소드 WNDPROC은 win32 api에 들어 있는 콜백 함수이며 .네트의 Control.WndProc 메써드로 wrap되어 있다. 다른 환경에서 이용되는 메써드 등을 자신의 환경에서 이용할 수 있게 가공하는 걸 wrap한다고 한다. ‘포장한다’는 뜻이다. 콜백 함수란 이벤트 실행 함수를 말한다. callback은 ‘답신’을 뜻한다. 내가 아무개에게 전화를 했는데 그가 받으면 용건을 말하고 끊으면 된다. 그러나 전화를 했는데 그가 없고 다른…

  • c# lock으로 멀티뜨레드 대이터 래이스 막기

    대이터 래이스 아래의 예제는 일부러 data race가 일어나게 한 거다. 동시에 두 개의 뜨레드에서 하나의 리스트에 대이터를 쓴다. 그 결과 리스트 값들은 듬성듬성 빠져 있다. 하나의 뜨레드에서 쓰기 작업을 끝내기 전에 다른 뜨레드에서 덮어쓰기 때문이다. lock으로 동기화 리스트에 쓰는 부분을 아래와 같이 lock으로 둘러싸면 대이터 래이스는 일어나지 않는다. 먼저 lock에 다다른 리스트에 대한 쓰기 작업이…

  • c++ 캐릭터 배열을 c# 배열로 마셜링하기

    아래 c++ 구조체 안의 캐릭터 배열을 c# 배열로 마셜링하는 데에는 UnmanagedType.ByValArray와 UnmanagedType.ByValTStr을 쓸 수 있다. UnmanagedType.ByValArray ByValArray를 쓰면 똑같이 캐릭터 배열로 바꾼다. c의 캐릭터는 ansi로서 1바이트를 차지하고 c#의 그것은 유니코드이며 크기가 2바이트다. 전자에서 한글을 표기하려면 두 개의 캐릭터들이 필요하다. 위의 c++ 예에서 구조체에는 한글 두 글자들만 들어갈 수 있으며 예를 들면 ‘가나\32(공백)’이다. 이걸 위의 c#…

  • c# 깊은 복사, 얕은 복사, 할당의 차이

    객체는 밸류 타입과 레퍼런스 타입으로 나뉜다. 깊은 복사, 얕은 복사, 할당은 레퍼런스 타입에서만 문제되며 특히 얕은 복사와 할당이 문제된다. 깊은 복사 레퍼런스 타입 객체를 deep copy하면 refer하는 객체와 refer된 밸류가 모두 새롭게 만들어진다. 레퍼런스만 복사하는 건 쉽지만 밸류까지 복사하는 건 어렵다. 시리얼라이즈를 한 뒤 디시리얼라이즈를 하던가 iCloneable 인터페이스를 써야 한다. 이런 문제는 주로 클래스를 복사할…

  • c# DateTime과 TimeSpan으로 날짜와 시간 제어하기

    DateTime .네트의 날짜와 시간은 델파이의 그것들에 비하면 좀 특이하다. 델파이의 날짜와 시간은 모두 double인데 .네트의 DataTime은 구조체이며 이거로는 제어를 충분히 할 수 없어서 TimeSpan이라는 구조체도 같이 써야 한다. DateTime은 시점이고 TimeSpan은 길이다. double에 비해 구조체의 용량이 더 크고 작동에도 부하가 크겠지만 그 차이가 얼마나 될지는 모르겠다. .네트의 구조체는 인스턴스가 만들어진 때 그 크기가 특정되지 않으므로…

  • 프로그래밍 실수의 크기 비교하기

    부동소수 프로그래밍 언어들에 따라 real, double, float, extended 등으로 이름지어지는 실수實數는 자릿수의 크기에 따라 정밀한 정도엄밀하게는 범위가 달라진다. 그래서 부동소수라고 한다. 여기에서 ‘부동’은 같지 않다는 不同이나 움직이지 않는다는 不動이 아니라 떠다닌다는 浮動floating-point이다. 예를 들어 어느 프로그래밍 언어의 실수형이 다섯 자리의 정확도precision를 보장한다고 하면 12,345.67890의 경우 소수들의 정확도는 담보되지 않는다. 그러나 0.67890의 경우에는 담보된다. 이러한 정확도의…