我来自c / c ++,c#中的新内容。
我认为对于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);
}
如果案例2也是宣布vector3的正确方法,我想我根本不需要使用new运算符。
它冗长而且效率不高。
任何评论plz。
答案 0 :(得分:3)
那么,案例1将起作用,而案例2实际上是一个不完整的初始化。如果声明一个结构而不用new初始化它,则必须手动初始化所有字段,否则不能将结构作为整体使用。您的案例有效,因为您只使用已初始化的x组件。但是这会失败:
Vector3 vectorB;
vectorB.x = 1;
Debug.Log("vectorB: " + vectorB); // <--CS0165: Use of unassigned local variable
使用构造函数始终确保初始化所有字段。
另请注意,字段需要初始化。如果您有私有字段并提供访问它们的属性,除非使用构造函数,否则无法初始化它们。
请参阅此问题以供参考:
C# Structs: Unassigned local variable?
答案 1 :(得分:1)
主要区别在于您开始在Unity引擎中处理Vector3的常见用途。
例如
transform.position.x = 1;
将无效,因为您无法修改`UnityEngine.Transform.position'的值类型返回值。
transform.position = new Vector3( 1, 0, 0 );
然而,当你为它分配一个新的Vector3时,会起作用。这与其他变换值相同,因此使用'new'运算符很好,因为它符合标准,更能说明您正在做什么。
使用构造函数是一种更好的实践,因为您可以保证访问正在创建的对象中的基本元素。通过仅初始化类,结构的特定部分,在尝试使用需要自己初始化的元素时可能会出现问题。
通过仅初始化Vector3中的x,如果尝试访问z元素,则会遇到此问题。 “使用可能未分配的字段'z'”
摘要:使用构造函数是更好的做法,因为它符合大多数类,并有助于避免空错误。