2013-08-08 15 views
6

Hãy nói rằng tôi có mã như thế này:Quy ước truyền đi trong danh sách cho một hàm tạo và lưu trữ nó là gì?

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

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

Để làm cho nó rõ ràng, tôi muốn để lưu trữ các đỉnh và các chỉ số bên trong nó trong constructor. Tôi đã không làm việc rất nhiều với C# vì vậy tôi không chắc chắn như thế nào quy ước trông. Tôi có phải tạo một bản sao của toàn bộ danh sách hoặc tôi có thể sao chép tài liệu tham khảo không? Quy ước là gì?

+0

Tôi biết, đó là lý do tại sao tôi hỏi tôi phải làm gì trong nhà xây dựng. –

+0

Sau đó, tôi đã đọc sai câu hỏi – Sayse

+0

Hơi chủ đề, nhưng tôi đặt câu hỏi về quy ước đặt tên được sử dụng tại đây. Có lẽ bạn nên sử dụng các tên khác nhau cho các tham số hàm tạo của mình hoặc tìm một số cách khác để phân biệt chúng. Ví dụ, tôi tiền tố tất cả các thành viên riêng với dấu gạch dưới; điều này cũng có lợi ích khi thông báo cho tôi về phạm vi của các biến này bất cứ khi nào tôi thấy chúng trong mã. "Có một dấu gạch dưới? Phải là một lĩnh vực riêng cho trường hợp này." –

Trả lời

6

Nó phụ thuộc vào ý định. Nói chung, mặc dù bạn muốn có một bản sao riêng biệt để bạn có thể kiểm soát việc sửa đổi các danh sách bên trong hàm. Đó là về đóng gói.

Nếu đó không phải là ý định của bạn với lớp học này, tuy nhiên, nó hoàn toàn tốt để chỉ lưu trữ các tham chiếu đến danh sách.

+0

Cảm ơn, tôi đã nhận ra rằng nó * không * phụ thuộc vào ý định. Trong trường hợp của tôi, tôi có lẽ chỉ muốn tạo một bản sao.Không có cơ chế di chuyển như trong C++, nếu tôi chắc chắn rằng tham số được truyền vào chỉ là tạm thời trong mã gọi, tôi có thể lưu trữ tham chiếu đến nó? –

+0

@JohannaOlofsson Không giống như C++, bạn không cần phải quan tâm đến việc liệu tham chiếu có "hợp lệ" hay không; nó sẽ có giá trị miễn là bạn giữ nó, chính xác * bởi vì * bạn đang nắm giữ nó. Câu hỏi đặt ra là liệu bạn có muốn thay đổi danh sách thông qua tham chiếu của bạn cũng được phản ánh trong việc sử dụng tham chiếu của người gọi hay không và ngược lại. Nếu bạn muốn * những ngữ nghĩa đó, hãy sao chép tham chiếu, nếu bạn không muốn những ngữ nghĩa đó, hãy tạo một bản sao của chính danh sách đó. – Servy

+0

Tôi đã không thực sự yêu cầu bất cứ điều gì liên quan đến tính hợp lệ của tài liệu tham khảo. Những gì tôi đã tự hỏi là nếu có bất kỳ cách nào để biết rằng bạn là người duy nhất giữ một tham chiếu. Điều đó sẽ làm cho bạn có thể chỉ cần sao chép các tài liệu tham khảo mà không cần lo lắng về bất cứ điều gì khác ảnh hưởng đến danh sách. –

4

Bạn chỉ có thể sao chép tài liệu tham khảo vào danh sách. Vì bạn đã cung cấp các biến thành viên và đối số hàm tạo của bạn có cùng tên, bạn phải sử dụng từ khóa this.

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

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

Các danh sách hiện nay sẽ được lưu trữ trong lớp Mesh của bạn

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

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

Nếu bạn muốn truy cập nó trong vòng Mesh, sau đó có, bạn sẽ cần phải đặt chúng ở đó. Điều này thường được thực hiện như trên.

0

Bạn nên luôn cẩn thận với những thứ này. Ví dụ, nếu lớp Mesh của bạn có nghĩa là không thay đổi được, thì bạn nên tạo một bản sao của dữ liệu để ngăn chặn một số mã bên ngoài thay đổi những gì được dự định là dữ liệu không thể chỉnh sửa.

Cá nhân, trừ khi tôi có lý do chính đáng để làm khác, tôi luôn lưu trữ bản sao dữ liệu.

1

Điều đó tùy thuộc vào những gì bạn cần. Bạn chỉ cần viết

this.vertices = vertices; 

Điều này sẽ lưu trữ tham chiếu đến danh sách. Điều này có nghĩa, mọi thay đổi được thực hiện bên ngoài sẽ phản ánh trong danh sách của bạn;

Mặt khác bạn có thể sao chép danh sách -

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

Điều này thực sự sẽ sao chép các mục trong danh sách và bạn sẽ không thấy thay đổi được thực bên ngoài. Lưu ý - các mục được sao chép sẽ vẫn là tham chiếu. Bất kỳ thay đổi nào được thực hiện cho chúng sẽ phản ánh bên trong phương thức của bạn. Nếu bạn muốn, bạn có thể tạo một bản sao của chúng cũng cho danh sách mới của bạn.

Một lần nữa - nó phụ thuộc vào những gì bạn cần.

+0

Câu hỏi cụ thể là liệu anh ta có nên sao chép danh sách hay chỉ sao chép tham chiếu chứ không phải * cách thực hiện *. Điều này không trả lời câu hỏi đó. – Servy

+1

"liệu ** cô ấy có nên sao chép danh sách" –

+0

@Servy Không có câu trả lời đúng cho "nên" hay không. Để hiểu những gì "nên" được thực hiện, người ta cần phải hiểu các tùy chọn khác nhau và tác động của họ. Đây là những gì tôi đã viết trong câu trả lời của tôi. Cú pháp đã được thêm vào để hoàn thành. – Vadim

Các vấn đề liên quan