2012-01-04 40 views
9

Tôi muốn sử dụng kiểu C# Point làm loại tham chiếu (đó là cấu trúc). Tôi nghĩ có một lớp học CPoint, có chứa một thành viên Point. Có cách nào để nâng cao các thành viên của Point để hoạt động với tư cách là thành viên của Cpoint không. Tôi cố gắng để tránhC# - trình bao bọc tham chiếu cho loại giá trị

cpoint.point.X; 
cpoint.point.Y; 

Tôi muốn làm

cpoint.X; 
cpoint.Y; 

cũng như giữ tất cả các chuyển đổi, khai thác, Empty vv
thể này dễ dàng được thực hiện?

+0

tại sao bạn muốn/cần một wrapper như vậy? – Xint0

+0

@ Xint0 Như tôi đã nói, sử dụng nó làm kiểu tham chiếu. – baruch

+2

@barunch: trước khi thực hiện điều đó, hãy xem xét rằng ** có một lý do ** tại sao các loại đơn giản đó được định nghĩa giống như một 'cấu trúc'. Một trong số đó là, 'struct' là rất nhanh trong phân bổ và' Point' struct được sử dụng trong các phương thức vẽ, nơi mà tốc độ phân bổ và giải phóng nó có thể rất quan trọng. – Tigran

Trả lời

4

Nếu bạn cần nó hoạt động như một loại tham chiếu thì hãy sử dụng từ khóa ref. Nó sẽ cho phép bạn vượt qua bằng cách tham chiếu. Với điều này bạn sẽ nhận được tất cả các lợi ích hiệu suất từ ​​nó là một cấu trúc, cũng như biết cụ thể khi bạn mong đợi nó hoạt động như một tham chiếu. Bạn cũng có thể sử dụng từ khóa out để trả lại tham số theo tham chiếu.

Nếu bạn cần nó để có thể đại diện cho null thì sử dụng một Nullable<T>

Nếu bạn chỉ muốn truy cập cũng giống như foo.MyPoint.X sau đó tuyên bố nó như là một lĩnh vực như sau:

class Foo { 
    public Point MyPoint; 
} 
+1

Tôi đã lập trình trong C# kể từ lần đầu tiên được tạo ra và không bao giờ biết bạn có thể làm điều đó (sử dụng " ref "với một loại giá trị)! Tuy nhiên, điều này có giới hạn của nó: không thể lưu trữ "tham chiếu" đó như là một phần tử của một bộ sưu tập. – ToolmakerSteve

5

Tôi nghĩ rằng cách duy nhất là phải viết lại và pass-through tất cả tài sản, khai thác và phương pháp, chỉ cần như thế này:

public class PointReference { 
    private Point point; 

    public int X { get { return point.X; } set { point.X = value; } } 
} 

(Việc thay đổi tên lớp được thiết kế; CPoint không phải là rất biểu cảm.)

+1

không phải là cách duy nhất, mà là cách – recursive

+0

Bạn có biết cách khác không? – Yogu

+5

Chắc chắn, không sử dụng một 'điểm' nào cả, nhưng thực hiện nó hoàn toàn chính mình. – recursive

8

Một cái gì đó như thế này?

public class CPoint { 
    private Point _point = new Point(0,0); 
    public double X { get { return _point.X; } set { _point.X = value; } } 
    public double Y { get { return _point.Y; } set { _point.Y = value; } } 
    public CPoint() { } 
    public CPoint(Point p) { _point = p; } 
    public static implicit operator CPoint(Point p) { return new CPoint(p); } 
    public static implicit operator Point(CPoint cp) { return cp._point; } 
} 

EDIT: Nếu bạn muốn tự động chuyển đổi thành/từ điểm, thực hiện chuyển đổi ngầm như trên. Lưu ý tôi đã không thử nghiệm này, nhưng họ nên làm việc. Thông tin thêm tại đây: http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx

+0

Có, ngoại trừ nó rất mệt mỏi để làm điều này cho mọi nhà điều hành và chuyển đổi và ... – baruch

+0

Xem chuyển đổi tiềm ẩn bổ sung –

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