2014-10-31 5 views
2

나는 c/C++에서 왔고, C#에서 새로왔다.
나는 C# 프로그래머가 그렇게 간단하고 어리석은 질문 일 수 있다고 생각한다.
Unity3D의 Vector3 선언 C#

어쨌든 Unity C#에서
두 가지 vector3의 선언의 차이점은 무엇입니까?

void TestDecl() 
{ 
    //case 1 
    Vector3 vectorA = new Vector3(1, 0, 0); 

    //case 2 
    Vector3 vectorB; 
    vectorB.x = 1; 

    //it print "1/1" 
    Debug.Log(vectorA.x + "/" + vectorB.x); 
} 


경우이 너무 vector3 선언하는 올바른 방법 인 경우


, 난 전혀 새로운 연산자를 사용할 필요가 없습니다 생각합니다.
장황하고 효율적이지 않습니다.


모든 댓글 plz.

+3

'구조체'입니다. 그래서 당신이 어떤 방향으로 가는가에 상관 없습니다. –

+1

C#에서 'new'를 사용하는 것은 C++에서와 완전히 다릅니다. 또한 C++에서 C#으로 이동할 때도이를 피하려고했습니다. C#에서는 초기화와 같이 사용해야하는 경우가 많으며 나쁜 습관이 아닙니다. – maZZZu

답변

3

케이스 1은 실제로 케이스 2가 불완전한 초기화 인 동안 작동합니다. 구조체를 new로 초기화하지 않고 선언하면 모두 필드를 수동으로 초기화해야하며 그렇지 않으면 구조체 전체를 사용할 수 없습니다. 당신이 초기화 한 x 구성 요소만을 사용하기 때문에 귀하의 주장이 효과가 있습니다. 그러나 이것은 실패합니다 :

Vector3 vectorB; 
vectorB.x = 1; 
Debug.Log("vectorB: " + vectorB); // <--CS0165: Use of unassigned local variable 

항상 생성자를 사용하면 모든 필드가 초기화됩니다.

필드을 초기화해야합니다. 비공개 필드가 있고 액세스 할 수있는 속성을 제공하는 경우 생성자를 사용하는 경우를 제외하고는 모두 초기화 할 수 없습니다.

참조 용으로이 질문을 참조하십시오 : 당신은 유니티 엔진 내 Vector3의 일반적인 용도를 처리하기 시작할 때
C# Structs: Unassigned local variable?

1

큰 차이가있다. 당신은`UnityEngine.Transform.position '의 값 형식의 반환 값을 수정할 수

transform.position.x = 1; 

예를

를 들어

이 작동하지 않습니다.

transform.position = new Vector3(1, 0, 0); 

그러나 새 Vector3을 할당 할 때 작동합니다. 이것은 다른 변환 값과 동일하므로 'new'연산자를 사용하면 표준을 준수하고 수행중인 작업을보다 잘 설명 할 수 있으므로 연산자가 좋습니다.

생성자를 사용하면 만드는 개체 내의 기본 요소에 대한 액세스가 보장된다는 점에서 더 나은 방법입니다. 구조체의 특정 부분 만 초기화하면 자체 초기화가 필요한 요소를 사용할 때 문제가 발생할 수 있습니다.

Vector3에서 x 만 초기화하면 z 요소에 액세스하려고하면이 문제가 발생합니다. "아마도 할당되지 않은 필드`z '의 사용

요약 : 대부분의 클래스를 따르고 null 오류를 피하는 데 도움이되므로 생성자를 사용하는 것이 더 좋습니다.