많은 C ++ 개발자가 끔찍한 C # 코드를 작성하는 것을 보았으므로 이것은 매우 좋은 질문입니다.
C #을 "더 좋은 구문을 가진 C ++"로 생각하지 않는 것이 가장 좋습니다. 그들은 당신의 생각에 다른 접근법을 요구하는 다른 언어입니다. C ++은 CPU와 메모리가 무엇을할지 끊임없이 생각하도록합니다. C #은 그렇지 않습니다. C #은 CPU와 메모리에 대해 생각하지 않고 작성 하려는 비즈니스 영역 에 대해 생각하도록 특별히 설계되었습니다 .
내가 본 이것의 한 예는 많은 C ++ 개발자들이 foreach보다 빠르기 때문에 for 루프를 사용하고 싶어한다는 것입니다. 이것은 반복되는 컬렉션의 가능한 유형 (따라서 코드의 재사용 성과 유연성)을 제한하기 때문에 일반적으로 C #에서 나쁜 생각입니다.
C ++에서 C #으로 다시 조정하는 가장 좋은 방법은 다른 관점에서 코딩을 시도하고 접근하는 것입니다. 수년에 걸쳐 여러분이 작성하는 코드를 필터링하기 위해 두뇌에서 "CPU와 메모리가 무엇을하고 있는지"스레드를 사용하는 데 익숙해지기 때문에 처음에는 이것이 어려울 것입니다. 그러나 C #에서는 비즈니스 도메인의 개체 간 관계에 대해 생각해야합니다. "컴퓨터가 무엇을하고 있는가"와 달리 "무엇을하고 싶은가"
목록에 for 루프를 작성하는 대신 객체 목록의 모든 작업을 수행하려면 루프를 IEnumerable<MyObject>
사용하고 사용하는 메소드를 작성하십시오 foreach
.
구체적인 예 :
결정적인 정리 (예 : 파일)가 필요한 자원의 수명을 제어합니다. 이것은 손에 사용하는 것이 쉽지만 리소스의 소유권이 이전 될 때 올바르게 사용하는 방법은 무엇입니까? C ++에서는 공유 포인터를 사용하고 적절한 시점에 '가비지 수집'을 처리하게합니다.
C #에서는 (특히 스레드 간)이 작업을 수행해서는 안됩니다. 파일에 무언가를해야하는 경우 한 번에 한 곳에서 수행하십시오. 클래스간에 전달되는 관리되지 않는 리소스를 관리하는 래퍼 클래스를 작성하는 것이 좋지만 스레드간에 File을 전달하거나 전달하지 않고 별도의 클래스에 쓰기 / 읽기 / 닫기 / 열기를하십시오. 관리되지 않는 리소스의 소유권을 공유하지 마십시오. Dispose
패턴을 사용하여 정리를 처리 하십시오 .
특정 제네릭에 대한 재정의 함수로 끊임없이 어려움을 겪고 있습니다 (C ++의 부분 템플릿 전문화와 같은 것을 좋아합니다). C #에서 일반 프로그래밍을 시도하는 것을 포기해야합니까? 어쩌면 제네릭은 의도적으로 제한되어 있으며 특정 문제 영역을 제외하고는 그것을 사용하는 것이 C #이 아닙니다?
C #의 제네릭은 제네릭으로 디자인되었습니다. 제네릭의 특수화는 파생 클래스에서 처리해야합니다. List<T>
a List<int>
또는 a 인 경우 왜 다르게 동작 해야 List<string>
합니까? List<T>
에 적용되는 모든 작업 은 일반에 적용됩니다 List<T>
. 의 .Add
메소드 동작을 변경하려면 내부에서 일반을 사용하지만 다른 방식으로 작업을 수행 List<string>
하는 파생 클래스 MySpecializedStringCollection : List<string>
또는 구성된 클래스 를 만듭니다 MySpecializedStringCollection : IList<string>
. 이를 통해 Liskov 대체 원칙을 위반하지 않고 수업을 사용하는 다른 사람들을 엄청나게 조이는 것을 피할 수 있습니다.
매크로와 유사한 기능. 일반적으로 나쁜 생각이지만 일부 문제 영역의 경우 다른 해결 방법이 없습니다 (예 : 디버그 릴리스로만 이동해야하는 로그와 같은 명령문의 조건부 평가). 그것들을 갖지 못한다는 것은 if (condition) {...} 상용구를 더 넣어야하고 부작용 유발 측면에서 여전히 동일하지 않다는 것을 의미합니다.
다른 사람들이 말했듯이 전 처리기 명령을 사용하여이 작업을 수행 할 수 있습니다. 속성이 더 좋습니다. 일반적으로 속성은 클래스의 "핵심"기능이 아닌 것을 처리하는 가장 좋은 방법입니다.
간단히 말해서 C #을 작성할 때는 CPU와 메모리가 아니라 비즈니스 영역에 대해서만 생각해야합니다. 필요한 경우 나중에 최적화 할 수 있지만 코드는 매핑하려는 비즈니스 원칙 간의 관계를 반영해야합니다.
C#
다른 코드를 생성 하는 데 사용하십시오 . aCSV
또는 anXML
또는 무엇을 입력으로 제출하고 aC#
또는SQL
파일을 생성 할 수 있습니다. 기능적인 매크로를 사용하는 것보다 더 강력 할 수 있습니다.