2009-04-23 6 views
3

저는 C++ 프로그래머로서 C#으로 옮겨 가고 있습니다. 저는 한 달 동안 언어를 사용하여 많은 개념을 이해했습니다.놀라움 C++에서 C#으로 이동

C++에서 C#으로 전환하는 중에 발생할 수있는 놀라움은 무엇입니까? 소멸자가 의도 한대로 처형되지 않는다는 경고를 받았습니다. 최근에 저는 T를 기본 클래스로 사용하는 제네릭으로 무언가를하려고했습니다. 그것은 작동하지 않았다. 나는 또 다른 문제가 있었지만 C#에서 경험하지 못했던 것을 짚어 보겠다. 나는 또한 내 앱이 RAM을 먹고 있다는 것에 놀랐다. 그런 다음 .dispose을 하나의 기능으로 사용해야한다고 생각했다. (나는 그것이 스마트 포인터처럼 정리 될 것이라고 생각했다)

그 밖의 무엇이 나를 놀라게 할 수 있냐?

부끄러운 언어는 사용하지 마십시오. 나는 누군가를 의지 할지도 모르지만 다만을 위해 ...

답변

3

나는 당신이 주요 것을 커버했다고 생각한다. 당신은 가비지 콜렉션을 읽고, 소멸자가없는 이유를 이해하고 IDisposable 패턴 (어떤 종류의 소멸자를 대체하는지)을 알아 내야한다. 나는 그것이 큰 것이라고 말하고 싶다.

내가 말할 수있는 유일한 다른 점은 C#과 .Net Base Class Library에 대해 경고하는 것입니다. 배울 점이 많습니다. 기본 사항을 다뤘 으면 가비지 컬렉션과 LINQ를 보려는 유형 시스템에 대해 살펴보고, 해당 지역의 관련 라이브러리/프레임 워크 (예 : WPF, WCF, ASP.Net 등)를 탐색하는 데 시간을 투자해야합니다. 그러나 그것은 모두 좋다. 나는 C++에서 C#으로 옮겨서 되돌아 가지 않을 것이고, 나는 더 생산적이라는 것을 알게된다. (나는 C++을 강타하지 않는다. 나는 아직도 dable을한다 .-))

0

개체 모델의 차이. 예를 들어, 값 및 참조 유형은 정의에 따라 구분되며 인스턴스화 방법에 따라 구분되지 않습니다. 여기에는 몇 가지 예가 있습니다.

myWinForm.Size.Width = 100; 

너비가 변경되지 않으면 새 Size 인스턴스를 만들어 지정해야합니다.

+0

글쎄, 그 중 하나도 컴파일되지 않습니다 ... 컴파일러는 이러한 유형의 오류를 나타냅니다. 게다가, 당신은 myWinForm.Width ;-p –

4

다행히 Microsoft는 여기에 정보 중 일부가 있습니다 : C# for C++ Developers.

구조체 대 클래스 차이점은 C++의 또 다른 장점입니다.

1

나는 몇 달 전에 거의 같은 변화를 겪었다. (자바로 변경하기 전에는 자바 프로그래밍에 많은 시간을 할애하지 않았다.) 세터 변경해야하는 경우 내가 아는 한 단계 씩 한 가장 큰 함정의

한 대 변수 대

특성 : 여기

내가 건너 한 가장 큰 함정 중 일부입니다 속성을 설정하거나 변수를 설정하거나 설정자를 사용하여 클래스의 일부 측면을 설정할 수 있습니다.

IList의 다른 컬렉션

은 IList, 목록 및 다른 모든 컬렉션 (IMO 당신이 정말로은 IList와 함께 많은 일을 할 수 없음) 사이의 차이를 알고 대 목록 대.

제네릭은 자신의 함정

을 할 그리고 당신은 제네릭을 많이 사용하려는 경우, 아마도이 글을 읽는 당신이 내 몇 가지 오류 방지하는 데 도움이 : Check if a class is derived from a generic class

을 그러나 일반적으로 내가 좋겠 변화가 꽤 고통스러워졌다.

1

글쎄, 언어가 완전히 다르다. C#으로 언제든지 작업 해왔다면 깨달은 것 같다. 당신은 C#에서 당신이 C++에서하는 것처럼 강력한 매크로 나 템플릿 (C#에 제네릭이 있다는 것을 알고 있습니다)을 가지고 있지 않습니다. 기억과 관련하여 더 이상 엄격하게 통제 된 환경에 있지 않음을 기억하십시오. 작업 관리자 및 유사한 도구에서 많은 메모리 사용량이 발생할 것으로 예상되는데 이는 정상적인 현상입니다. 진정한 메모리 사용량을 확인하려면 더 세분화 된 성능 카운터가 더 있습니다. 또한 생각한 것만 큼 (아마도 블록을 "사용"하지 않은 경우) 체크 아웃 할 필요는 없습니다.

또 다른 분명한 하나는이 새로운 푸 객체를 생성하지 않는 C#에서 기본 생성자 :

Foo myFoo; 
방금 ​​것으로 그 생각을하지 않는 한 "무효 포인터"같은 것을 가질 수 없습니다

type 객체의 참조를 갖는 것과 같습니다. 또한 C++ 구문으로 볼 때 공용 멤버가 아니라 메서드에 대한 구문 적 설탕으로 Properties를 생각해야합니다.

"out"및 "ref"매개 변수를 반드시 이해하십시오.

분명히 큰 목록이 아니라 단지 몇 개의 "포인터"(말장난 없음)입니다.

1

다소 큰 주제입니다. 몇 가지 생각 :

C#은 가비지 수집됩니다. 리소스 할당에 대해주의를 기울일 수는 없지만 일반적으로 가장 일반적인 리소스 인 메모리에 대해서는 거의 걱정할 필요가 없습니다.

C#에서 모든 것이 개체입니다. "기본"데이터 유형이 없으며 int가 객체 인 경우에도 마찬가지입니다.

C#은 범용 텍스트를 포함하며 템플릿은 가지고 있지 않습니다. 템플릿은 C#의 유사 구문 제네릭보다 훨씬 풍부하고 복잡하지만 제네릭은 많은 두통없이 템플릿의 거의 모든 실질적인 유틸리티를 제공합니다.

C#에는 인터페이스와 단일 상속이 있습니다. C++에서 다중 상속을 찾으려면 대신 인터페이스 또는 다른 디자인 패턴 (예 : 전략)을 사용하십시오.

C#에는 함수 포인터 대신 대리자가 있습니다. 델리게이트는 기본적으로 형식화 된 함수 포인터입니다. 대리인 및 대리인 - 친척 (람다 식, 이벤트, 술어 등)의 사용은 매우 강력하고 공부에 많은 노력을 기울일 가치가 있습니다.

C#은 수확량 반환을 지원합니다. 이것은 C# 방식으로 매우 기본적인 작업입니다. 일부 세트를 반복하는 가장 일반적인 형태는 foreach를 사용하는 것입니다. IEnumerable과 반복기가 어떻게 작동하는지 이해할 가치가 있습니다.C++에서 사용할 수없는 및 약간 놀라운 수 있습니다 내가 언급 보지

0

어떤 것들은 attributesreflection

속성입니다 같은 당신에게 제공하지 않습니다 AOP 본격적인 가득. 그러나 C++로 해결할 방법과는 다른 방식으로 많은 문제를 해결할 수 있습니다.