C++의 경우 .h 파일과 .cpp 파일을 #include를 이용하여 컴파일 시 전처리기의 내용을 복사 및 붙여놓기하는 작업을 했었다. C#에서는 이러한 것들이 없어졌다. #if, #endif와 같은 전처리기는 아직 존재한다.
C#에서는 대신 같은 namespace에만 있으면 외부 파일이더라도 접근이 가능하다.
Java와 비슷하게 CIL(Common Intermediate Language)가 존재하여 C#뿐만 아니라 Visual Basic 언어를 컴파일하면 CIL 바이트코드로 어느 운영체제든 가상머신을 이용하여 CIL 바이트코드로 무슨 환경이든 돌릴 수 있다.
C++은 사용자가 잘 쓸거라고 믿고 일단 모든걸 만들어놓는다. 즉, 사용자를 믿지만, C#의 경우 사용자를 믿지않고 버그가 생길 여지가 있으면 오류를 발생시킨다.
다음 사진은 C++에서 운영체제에 따른 바이트 수 이다. 보면 포인터에서 사이즈가 다른 것을 알 수 있다. 실제 16bit 컴퓨터의 경우 int형이 2byte였다. 이처럼 환경에 따라서 자료형의 크기가 다르지만, C#의 경우 컴파일하여 CIL로 만들기 때문에 가상머신을 만드는 개발자가 잘 만들어놔서 우리는 컴퓨터 환경을 쓰지않고 고정된 자료형을 사용할 수 있다.
각 객체를 효율적으로 관리하기 위해서, 혹은 다형성을 이용하기 위해서 object 클래스가 상속되어있는 형태이다. (C++은 미존재)
c++의 경우 char은 1byte, C#의 경우 char은 2byte이다.
C++의 경우 ASCII를 사용하여 문자를 사용하는 반면 C#은 UTF-18 즉, 유니코드로 영어뿐만 아니라 한국어 또한 지원한다.
c#의 struct의 기본 접근제어자는 private이라 접근제어자 정의 또한 필요하다. (C++에서는 기본 접근제어자는 public이다.)
new로 할당해도 스택에 할당된다는데 이해는 되지않는다.
C++의 경우 다중 상속이 가능하지만, C#의 경우 단일 상속만 가능하다.
다만, Interface같은 abstract class의 경우 추가적으로 상속이 가능하다.
가상함수는 virtual , 순수 가상함수는 abstract 키워드를 사용한다.
또 자식 클래스의 가상함수에는 override를 해야 한다.
event는 delegate를 이용하여 event 멤버를 정의하면 +=, -=을 이용하여 이벤트를 등록하고 제거할 수 잇다.
해당 글을 바탕으로 개인적으로 알고있는 내용을 첨삭했습니다.
출처 : https://itpassion.tistory.com/entry/C%EC%99%80-C%EA%B0%84%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90