2011-12-21 4 views
4

나는 C++ 배경에서 왔고 스스로 C#을 가르치려고합니다. 저는 여전히 학생이고 이것은 학교 프로젝트가 아니며 지금 당장 쉬고 있습니다. 내 주요 초점은 C/C++, java였습니다. C/C++, java되었습니다. 저는 2 년 전의 C++에서 DVD, 책, DVD, 정보를 컨테이너에 저장하고 표시하는 오래된 학교 프로젝트를 가지고 있습니다. 나는 C#에서 같은 프로그램을 만들려고 노력하고콜렉션 C#

나는이 개 매우 유사 질문 .. 내 프로그램에서

과 같이 용기의 용기에 형식 정의 사용했다 객체가 있습니다

typedef set<Item*> ItemSet; 

ItemSet allBooks;   // holds all the information 
ItemSet allCDS; 
ItemSet allDVDs; 

첫 번째 질문은 거기에 typdef있는 C#을 나는 그 동등한 사용하는 것 같아요? 하지만 나는 컨테이너에서 그것을 사용할 수 없다. C#에서 비슷한 비슷한 작업을 수행 할 수 있습니까? 아니면 여러 세트를 만들어야합니까? 나는 HashSet의는 C++

HashSet<Item> keys = new HashSet<Item>(); 

두 번째 질문 나는 또한 클래스 외부 세트에 형식 정의를 사용하고 민간 부분 에 내가 만든 세트의 객체되어있는 설정과 유사 결정했다. C#에서이 작업을 수행 할 수 있습니까?

typedef set<string> StringSet; 

class Item 
{ 

private: 

string Title; 
StringSet* Keys;  // holds keywords 

C#에는 포인터가 없습니다.

+4

중 하나 "C#을 더 포인터가 없습니다"또는 당신의 관점에 따라, "거의 모든 C#에서 포인터입니다" 전망. –

+0

"안전하지 않은 코드에 C#에서 포인터가 없다"는 것을 알았습니다. http://msdn.microsoft.com/en-us/library/chfa2zb8%28v=vs.71%29.aspx –

답변

3

C#에는 typedef과 같은 것이 없습니다. 유형 이름을 직접 사용하기 만하면됩니다.

HashSet<Item> allBooks = new HashSet<Item>(); 
HashSet<Item> allCDs= new HashSet<Item>(); 
HashSet<Item> allDVDs = new HashSet<Item>(); 
HashSet<string> keys = new HashSet<string>(); 

그래서 ...

class Item 
{ 
    private string title; 
    private HashSet<string> keys = new HashSet<string>();  // holds keywords 

using 문은 컴파일러가 타입 이름을 해결하기 위해 검색해야 네임 스페이스를 선언합니다. 위의 작업을 수행하려면

using System.Collections.Generic; 

소스 파일의 맨 위에 있어야합니다. using 문없이

당신은 C++의 typedef C#으로 평행 개념이 없습니다

System.Collections.Generic.HashSet<Item> allBooks = new System.Collections.Generic.HashSet<Item>(); 
2

해야 할 것입니다. 당신은 여전히 ​​전체를 사용할 필요가

var keys = new HashSet<Item>(); 

HashSet<Item> keys = new HashSet<Item>(); 

과 동일합니다 : 당신의 인생을 더 쉽게하고 당신에게 입력을 저장하려면, C#을 로컬 변수/초기화 선언에서 유형을 건너 뛸 수 있습니다 멤버 선언을 입력하십시오.

class MyClass { 
    ISet<Item> allBooks = new HashSet<Item>(); 
} 

이 코드에서 무엇을 변경하지 않고 나중에 구현을 전환 할 수 그러나, 그것은 좋지 않아 정확한 유형으로, 인터페이스로 멤버를 선언하는 연습이다.

+0

'ItemSet = System.Collections.Generic.HashSet ;을 사용하면 '에서 typedef와 비슷한 것을 얻을 수 있습니다. C++. – Marlon

+0

@ Marlon 나는이 유사성이 C++ 후에 C#을 시도하는 누군가에게 많은 도움을주기에는 너무 일찍 끝난다 고 생각한다. 'using' 선언은 컴파일 유닛 내부의 유형에만 작동하고 네임 스페이스 본문의 끝을 지나서 확장되지 않으며 리플렉션에서 보이지 않는 로컬'# define '과 같습니다. 나는 그것이 대답보다 더 많은 질문을 가져올 것이라고 생각한다. – dasblinkenlight

1

C#은 명시 적으로 typedef을 가지지 않으며 가장 가까운 것은 type alias을 작성하는 using 선언입니다.'나에게 피난처를 using directive과 형식 정의를 위해 해당이 있습니다

var set = new StringSet(); 
+1

참고로, C++에서 헤더에'typedef '를 넣을 수 있고'#include'헤더에'StringSet'을 사용하고 싶다면 C와는 달리 모든 파일에서 타입 별칭을 사용해야합니다. 당신은'StringSet' 별명을 사용하기를 원했습니다. –

1

하지만, 그런 다음 나중에 당신이 뭔가를 할 수있는에

using StringSet = System.Collections.Generic.HashSet<string>; 

: 당신의 C# 파일의 상단에 당신이 뭔가를 할 수 그것은 일반적으로 사용되는 보았다. 전체 유형이 일반적으로 사용됩니다. 필요에 따라 (예 : 아이템 컬렉션 옆에 다른 데이터를 저장해야하는 경우) public class ItemSet : List<Item>과 같은 클래스를 만듭니다. 세트가 두 번 이상 같은 항목을 포함 할 수 없습니다 때

HashSet<T> 사용되어야하며, Object.EqualsObject.GetHashCode 방법은 데이터 유형에 대한 의미있는 (기본적으로, 그들은 본질적으로 객체의 값이 아닌 인스턴스를 식별). 객체가 세트에 없으면 자동으로 객체를 추가합니다. 훨씬 더 일반적인 방법은 List<T>을 사용하여 항목을 저장하는 것입니다. 당신의 상황을 조금이라도 알면, List<T>이 효과가 있습니다.

class Item 
{ 
    private string Title; 
    List<string> Keys;  // holds keywords 
} 

그리고 :

그래서 내가 좋아하는 뭔가를 권 해드립니다

List<Item> allBooks = new List<Item>(); 
List<Item> allCDs= new List<Item>(); 
List<Item> allDVDs = new List<Item>();