2011-03-09 5 views
1

첫 번째로, 지식의 부족, 많은 사람들 (많은 초심자, 어쨌든)에게 관련성을 부여하는 방법에 대해 사과드립니다. 유일한 프로그래밍 경험은 Unity입니다. 아니 that Unity, 내가 방금이 사이트를 검색하는 동안 들었어요. 그들은 단지 두 모든 용기이야 (열거 형이 없으면 <string, TValue> 사전 대신 컴파일 타임 오류가 발생할 수 있습니다.

class Cameras { 
    public Camera left, right; 
} Cameras cameras; 

나 자신이 클래스의 무리를 만드는 찾을 :

나는 이런 종류의 들어, 클래스보다 더 나은 데이터 구조가 있는지 알고 싶어요 개체), 그들은 더 나은 사전에 의해 제공 될 것 같은데 - 나는 열쇠로 문자열로 발생하지 않습니다 철자를 망칠 경우 컴파일 타임 오류 싶습니다. 또한 int가 어떤 객체와 함께 사용되는지 기억하고 싶지 않기 때문에 배열이나리스트를 사용하고 싶지도 않습니다. 이렇게 각 클래스에 대한 열거 형을 만들 수 있고 클래스 대신 사전으로 전환 할 수는 있지만 나에게는 어리 석습니다. 대체 방법이 있습니까? 필자에게 필요한 것은 열거 형 (Array) 또는 목록 (List)과 관련된 항목을 정의 할 수있게 해주는 구조이지만, 더 나은 아이디어가 있다고 확신합니다. ;-)

(*) 그러나 모든 정보가 제공 한 것부터 분명히 존재하는 모델입니다. 이것은 근본적인 문제처럼 보였습니다, 나에게, 그리고 왜 그것이되지 않았는지 궁금해. 아래 구문이 다른 용도로 사용되었는지는 모르겠지만 나에게 합리적인 것처럼 보입니다.

public class StereoCameraSystem : MonoBehaviour { 
    // You populate cameras in the Unity Editor GUI. 
    // Have the language implement something like this... 
    [SerializeField] Camera [] {left, right} cameras; 

    // define StereoCameraSide enum here 

    void ListCameras() { 
     Debug.Log(cameras[left]); // ...so you can use this... 
     Debug.Log(cameras[StereoCameraSide.Left]); //...and avoid this. 
    } 
} 
+0

제목이 하나의 질문 (사전을 사용할 때 강력한 유형 검사) 인 것으로 보이지만 본문이 다른 질문 (소규모 수업)을 묻는 것 같습니다. – dthorpe

+0

_ "enums가 없다"_ -'enum'을 사용하면 문제에 대한 훌륭한 해결책이 될 것입니다. 왜 당신을위한 옵션이 아닌가? –

+0

질문을 수정했습니다.희망적으로 그 점이 명확 해집니다. 내가 여기서 들었던 것과 내가 배운 모든 것에서, 나는 나의 질문에 대한 대답이 "아무것도 유용하지 않다"고 생각한다. 나는 그것을 믿기가 힘듭니다. – Jessy

답변

0

스위프트의 튜플 문제를 해결했다. 이 기능이 필요할 때 C#은 사용할 수있는 언어가되기 전에 튜플을 Swift처럼 변경해야합니다.

let cameras: (left: Camera, right: Camera) 
1

깨끗하고 읽기 쉬운 C# 코드를 작성하려면 많은 (때로는 긴) 클래스 선언을 작성해야합니다. 이것은 객체 지향 프로그래밍이 작동하는 방식입니다.

가독성을 희생하게되면 문제가되는 대안은 튜플을 사용하는 것입니다. 튜플은 안전한 방식으로 두 가지 (또는 그 이상) 사물을 가능한 다른 유형으로 묶는 데이터 구조입니다. 두 대의 카메라를 표현하기 위해, 당신은 쓸 수 :

// Wrap two cameras into tuple data structure 
Tuple<Camera, Camera> cameras = Tuple.Create(firstCamera, secondCamera); 

// Get the first camera 
cameras.Item1 
// Get the second camera 
cameras.Item2 

유일한 불행한 것은 당신이 Item1Item2 대신 좋은 이름 (같은 LeftRight)를 사용해야한다는 것입니다. 튜플은 가끔 더 가벼운 프로그래밍 스타일을 제공하는 함수형 프로그래밍에서 비롯됩니다. 원한다면 .NET 용 함수 언어 인 F #을 확인할 수 있습니다.

+0

클래스 정의의 문제점은 클래스의 인스턴스가 하나 뿐이며 배열에 해당하는 것을 저장한다는 것입니다. 이 일을하는 일반적인 방법입니까? 대안으로 leftCamera 및 rightCamera라는 두 개의 카메라를 저장하는 것입니다. 사용한 적이있는 메서드의 핵심은 가독성이므로 Tuples는 좋은 일치라고는하지 않습니다. – Jessy

3

사전은 문자열로 색인 할 필요가 없습니다. Dictionary<MyEnum, MyClass>을 가질 수 있으며, 열거 형을 기준으로 색인을 생성 할 수 있습니다. 그런 다음 사전에서 뭔가를 찾을 때 열거 형 식별자를 잘못 입력하면 전체 컴파일러 오류 검사를 받게됩니다. C#을 4.0이 (가 더 인텔리 지원이없는 점에 유의)과 같아야에서

+0

하지만 내가 아는 한 열거 형을 따르는 다른 것들이 없다면 모든 클래스의 열거 형을 생성해야 할 것입니다. 이것은 나에게 자주 발생하지 않습니다. 어떻게 든 잘못 됐어? – Jessy

+0

열거 형 대신에 여러 하위 클래스가 있고 사전에 인스턴스가 하나만 있다고 가정 할 경우 Dictionary 형식으로 인덱스 할 수 있습니다. 다음과 같은 액세스 : obj = dictionary [typeof (FooClass)] 사전 의 핵심 기능은 모든 객체에서 색인을 생성 할 수 있다는 것입니다. String은 객체이고 enum은 객체이며 type은 객체입니다. – dthorpe

+1

위로 enum : 해당 사전에 사용할 모든 가능한 인덱스 값을 나열하는 각 사전에 대한 열거 유형을 정의하고 그 열거 형은 해당 사전에 넣을 각 객체에 대해 하나의 값을 포함합니다. – dthorpe

2
enum CameraKind { 
    Left, 
    Right 
} 

var cameras = new Dictionary<CameraKind, Camera> { 
    { CameraKind.Left, leftCamera }, // shortcut for Add method 
    { CameraKind.Right, rightCamera } 
}; 

DoSomethingWith (cameras [CameraKind.Left]); 
0

는 :

dynamic cameras = new ExpandoObject(); 
cameras.left = new Camera(); // set the property to initialize it 
Debug.Log(cameras.left); 
관련 문제