6

假设我有这样的代码:

    private IList<Vector3> vertices;
    private IList<uint> indices;

    public Mesh(IList<Vector3> vertices, IList<uint> indices)
    {
        // ???
    }

为了清楚起见,我想将顶点和索引存储在构造函数中。我没有经常使用 C#,所以我不确定约定的外观。我应该复制整个列表还是可以只复制参考?什么是约定?

4

5 回答 5

6

这取决于意图。不过,一般来说,您需要一个单独的副本,以便您可以控制函数内列表的修改。这是关于封装的。

如果这不是你对这个类的意图,那么只存储对列表的引用就很好了。

于 2013-08-08T15:03:50.323 回答
4

您可以只复制对列表的引用。由于您为成员变量和构造函数参数提供了相同的名称,因此您必须使用this关键字。

private IList<Vector3> vertices;
private IList<uint> indices;

public Mesh(IList<Vector3> vertices, IList<uint> indices)
{
    this.vertices = vertices;
    this.indices = indices;
}

列表现在将存储在您的 Mesh 类中

于 2013-08-08T15:03:54.677 回答
1

这取决于你需要什么。你可以简单地写

this.vertices = vertices;

这将存储对列表的引用。这意味着,外部所做的每一项更改都将反映在您的列表中;

另一方面,您可以复制列表 -

this.vertices = new List<Vector3>(vertices);

这实际上将复制列表中的项目,您将看不到外部所做的更改。注意 - 复制的项目仍将是参考。对它们所做的任何更改都将反映在您的方法中。如果您愿意,您也可以为您的新列表制作一份副本。

再次 - 这取决于你需要什么。

于 2013-08-08T15:06:30.717 回答
0
private IList<Vector3> vertices;
private IList<uint> indices;

public Mesh(IList<Vector3> vertices, IList<uint> indices)
{
    this.vertices = vertices;
    this.indices = indices;
}

如果您想在 中访问它Mesh,那么是的,您需要将它们放在那里。这通常如上所述完成。

于 2013-08-08T15:04:10.303 回答
0

你应该总是小心这些事情。例如,如果您的 Mesh 类是不可变的,那么您应该制作数据的副本,以防止某些外部代码更改原本是不可编辑的数据。

就个人而言,除非我有充分的理由不这样做,否则我总是存储数据的副本。

于 2013-08-08T15:05:25.353 回答