2009-05-06 43 views
16

Ngoài sự hữu ích đáng ngờ về vấn đề này, tôi muốn hỏi liệu có thể làm điều gì đó dọc theo những dòng này hay không.Tùy chỉnh nguyên thủy trong C#?

class MyPrimitive { 
     String value; 
     public String Value { 
      get { return value; } 
      set { this.value = value; } 
     } 
} 

// Instead of doing this... 
MyPrimitive a = new MyPrimitive(); 
a.Value = "test"; 
String b = a.Value; 

// Isn't there a way to do something like this? 
MyPrimitive a = "test"; 
String b = a; 

Tôi thích quấn loại nguyên thủy vào các lớp tùy chỉnh sử dụng một tài sản để làm cho getset phương pháp thực hiện những thứ khác, như xác nhận.
Vì tôi đang làm điều này khá thường xuyên, tôi nghĩ rằng nó sẽ được tốt đẹp để cũng có một cú pháp đơn giản, giống như cho các nguyên thủy chuẩn.
Tuy nhiên, tôi nghi ngờ rằng điều này không chỉ không khả thi mà còn có thể sai về mặt khái niệm. Mọi thông tin chi tiết sẽ được chào đón nhiều nhất, cảm ơn.

Trả lời

29

Sử dụng loại giá trị (struct) và cung cấp cho nó implicit conversion operator từ loại bạn muốn ở phía bên phải của bài tập.

struct MyPrimitive 
{ 
    private readonly string value; 

    public MyPrimitive(string value) 
    { 
     this.value = value; 
    } 

    public string Value { get { return value; } } 

    public static implicit operator MyPrimitive(string s) 
    { 
     return new MyPrimitive(s); 
    } 

    public static implicit operator string(MyPrimitive p) 
    { 
     return p.Value; 
    } 
} 

CHỈNH SỬA: Tạo cấu trúc bất biến vì Marc Gravell hoàn toàn đúng.

+0

Đây chính là điều người hỏi đang tìm kiếm. Nó không chính xác là một "nguyên thủy tùy chỉnh", nhưng nó bắt chước một cái cũng như có thể, và là con đường đúng đắn để đi vào C#. – Noldorin

+4

Nếu bạn làm cho nó một cấu trúc, bạn nên ** hoàn toàn ** làm cho nó bất biến cùng một lúc; có một {get; set;} trên một cấu trúc là một ý tưởng rất, rất tồi. Tôi đã đề cập đến sự xấu xa? –

+0

Hoàn toàn đồng ý, xin lỗi vì sự nhầm lẫn. Ban đầu tôi đã sai, cố gắng bắt chước ví dụ của anh ấy càng chặt chẽ càng tốt. –

1

Bạn có thể sử dụng truyền ngầm. Nó không được khuyến khích, nhưng:

public static implicit operator string(MyString a) { 
    return a.Value; 
} 
public static implicit operator MyString(string a) { 
    return new MyString { value = a; } 
} 

Một lần nữa, thực hành không tốt.

+1

Không chắc chắn nó luôn luôn "thực hành xấu". Phụ thuộc vào bối cảnh, theo ý kiến ​​của tôi. – Noldorin

+0

Sử dụng toán tử chuyển đổi trên các loại tham chiếu ẩn hiển thị đối tượng mới; hoặc tệ hơn, trả lại một tham chiếu cũ cho các loại có thể thay đổi (không phải chuỗi) chỉ có thể gây ra sự cố. Đối với tôi, điều đó chỉ thích hợp với các toán tử chuyển đổi trên các loại giá trị, và để lại các loại tham chiếu đến up- và downcasts. –

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