假设我有这样的代码:
private IList<Vector3> vertices;
private IList<uint> indices;
public Mesh(IList<Vector3> vertices, IList<uint> indices)
{
// ???
}
为了清楚起见,我想将顶点和索引存储在构造函数中。我没有经常使用 C#,所以我不确定约定的外观。我应该复制整个列表还是可以只复制参考?什么是约定?
这取决于意图。不过,一般来说,您需要一个单独的副本,以便您可以控制函数内列表的修改。这是关于封装的。
如果这不是你对这个类的意图,那么只存储对列表的引用就很好了。
您可以只复制对列表的引用。由于您为成员变量和构造函数参数提供了相同的名称,因此您必须使用this
关键字。
private IList<Vector3> vertices;
private IList<uint> indices;
public Mesh(IList<Vector3> vertices, IList<uint> indices)
{
this.vertices = vertices;
this.indices = indices;
}
列表现在将存储在您的 Mesh 类中
这取决于你需要什么。你可以简单地写
this.vertices = vertices;
这将存储对列表的引用。这意味着,外部所做的每一项更改都将反映在您的列表中;
另一方面,您可以复制列表 -
this.vertices = new List<Vector3>(vertices);
这实际上将复制列表中的项目,您将看不到外部所做的更改。注意 - 复制的项目仍将是参考。对它们所做的任何更改都将反映在您的方法中。如果您愿意,您也可以为您的新列表制作一份副本。
再次 - 这取决于你需要什么。
private IList<Vector3> vertices;
private IList<uint> indices;
public Mesh(IList<Vector3> vertices, IList<uint> indices)
{
this.vertices = vertices;
this.indices = indices;
}
如果您想在 中访问它Mesh
,那么是的,您需要将它们放在那里。这通常如上所述完成。
你应该总是小心这些事情。例如,如果您的 Mesh 类是不可变的,那么您应该制作数据的副本,以防止某些外部代码更改原本是不可编辑的数据。
就个人而言,除非我有充分的理由不这样做,否则我总是存储数据的副本。