c#

  • c# 캐릭터 배열 char[]를 아규먼트로 넘길 때 주의할 점

    String.ToCharArray는 인스턴스를 만든다. 아래의 코드에서 캐릭터 배열은 초기화되지 않았지만 제대로 실행된다. 캐릭터 배열은 레퍼런스 타입이므로 이걸 아규먼트로 받은 메서드에서 그 값을 수정하면 호출한 메서드에도 반영된다. String.ToCharArray를 이용하면 chars는 새로운 인스턴스를 갖게 되므로 호출한 메서드에는 반영되지 않아서 널 문자 다섯 개만 출력된다.

  • c# 클래스의 필드를 public으로 만들어 써도 되는 경우

    클래스 안에 만들어지는 프라퍼티와 필드는 데이터를 저장하는 데에 있어서는 기능하는 게 비슷하다. 이들 사이에서 어떤 걸 써야 하나 애매하다. 필드에 접근하려면 public으로 만들어야 한다. 마이크로소프트는 필드를 퍼블릭으로 만들지 말라고 한다. 필드를 퍼블릭으로 만들지 않으면 필드에 직접 접근할 수 없다. 프라퍼티를 만들어서 거쳐야 한다. 복잡하다. 프라퍼티만 만들어서도 필드를 대체할 수 있다. 뒤에 { get; set; }를…

  • c# 널러블 변수를 이해하고 cs8604 경고를 없애는 방법

    ComboBox.ObjectCollection.Add()는 널을 아규먼트로 받을 수 없다. 이 메서드에 널을 넣으면 애플리케이션이 멈춘다. 아래의 코드에서 method1에 널 아닌 값이 가더라도 컴파일러는 cs8604 경고를 보낸다. 의도하지 않은 상황에 널이 전달되어 애플리케이션이 멈추는 것을 막으려는 거다. 변수 오른쪽에 ?를 붙이면 널도 값으로 가질 수 있는 변수가 된다. 이걸 nullable variable이라 한다. 위 예제에서는 cs8604 상황을 일부러 만들기 위해서…

  • [c#] 클래쓰를 직렬화하여 파일로 저장하기

    밸류 타입 데이터를 메모리나 파일에 저장할 경우에는 그냥 순서대로 write하거나 시작 메모리 주소와 전체 크기를 지정하여 한꺼번에 write하면 되지만 레퍼런쓰 타입은 이렇게 하면 주소만 저장된다. 이런 문제를 피하기 이해 저장할 데이터를 바이트의 형태로 나열하는 걸 serialize한다고 한다. 델파이와 달리 .네트에는 씨리얼라이즈하기에 편한 클래쓰들이 준비되어 있다. 최근까지는 BinaryFormatter가 많이 이용되었지만 마이크로쏘프트는 이걸 이제는 이용하지 말고 XmlSerializer나…

  • [c#] goto를 써야 할 때

    흔히들 goto는 가급적 쓰지 말라고 한다. 나도 좋아하지는 않는다. 레퍼런쓰는 아래와 같은 경우 완전히 빠져나오고 메떠드를 분리하는 걸 권한다. When you work with nested loops, consider refactoring separate loops into separate methods. That may lead to a simpler, more readable code without the goto statement.– Jump statements – break, continue, return, and goto 그러나 늘…

  • [c#] 정적 멤버가 정적이지 않은 멤버에 접근할 수 없는 이유

    정적 메떠드와 프라퍼티는 static 선언이 되지 않은 필드와 이벤트에 접근할 수 없다. 정적 멤버는 프로그램이 실행될 때 로드되는데 이때 정적이지 않은 멤버는 로드되지 않은 상태이기 때문이다. If your class contains static fields, provide a static constructor that initializes them when the class is loaded.– Static Classes and Static Class Members (C# Programming Guide) 참고로 여기에서…

  • [c#] 클래쓰 인스턴쓰를 IntPtr로 변환하기

    c# 프로그래밍만 할 때에는 이럴 일이 없는데 c++이나 델파이로 만든 dll을 이용한다면 클래쓰나 구조체를 포인터로 넘겨줘야 하는 경우들이 많다. 포인터는 메모리의 주소를 나타내는 결국 정수다. 특정 객체가 위치해 있는 메모리상의 위치와 그 크기만 안다면 어디에서부터 어디까지 그대로 넘겨서 데이터를 전송할 수 있다. 정수 두 개만 제어하면 되니까 아마도 대부분의 경우 정수 두 개보다는 훨씬 크기가…

  • c#과 델파이의 정수 나누기 결과 차이

    델파이의 경우 단순하다. 무엇을 무엇으로 나누던 그 결과를 그대로 반환한다. 예를 들어 1/2를 정수 변수에 반환하려 하면 오류로 처리된다. 그러나 c#에서는 복잡하다. 정수를 정수로 나누면 정수 즉 몫만 반환한다. For the operands of integer types, the result of the / operator is of an integer type and equals the quotient of the two operands rounded…