2008-10-14 27 views
14

Tôi chỉ nhận thấy rằng bạn có thể làm điều này trong C#:C#: Cách thức hoạt động: Đơn vị myUnit = 5;

Unit myUnit = 5; 

thay vì phải làm điều này:

Unit myUnit = new Unit(5); 

Có ai biết làm thế nào tôi có thể đạt được điều này với cấu trúc của riêng tôi? Tôi đã xem xét cấu trúc Unit với phản xạ và nhận thấy thuộc tính TypeConverter đang được sử dụng, nhưng sau khi tạo một TypeConverter tùy chỉnh cho cấu trúc của mình, tôi vẫn không thể có được trình biên dịch cho phép cú pháp thuận tiện này.

Trả lời

31

Bạn cần cung cấp một nhà điều hành chuyển đổi ngầm từ int để đơn vị, như vậy:

public struct Unit 
    { // the conversion operator... 
     public static implicit operator Unit(int value) 
     { 
      return new Unit(value); 
     } 
     // the boring stuff... 
     private readonly int value; 
     public int Value { get { return value; } } 
     public Unit(int value) { this.value = value; } 
    } 
+0

Oooh luôn những điều mới mẻ để tìm hiểu - không thể tin rằng tôi đã không bao giờ đi qua này trước khi – cbp

+0

Ngoài ra còn có một diễn viên "rõ ràng" - hoạt động giống nhau, nhưng người gọi phải thêm (Đơn vị); thường được sử dụng khi có nguy cơ mất dữ liệu (độ chính xác/dải/tỷ lệ/v.v. - ví dụ float => int) –

+0

Các toán tử tải trọng rất mạnh, nhưng tread nhẹ khi bạn làm như vậy: Thật dễ dàng để tạo mã rất khó lường đối với các lập trình viên bảo trì. Sử dụng nó khi nó thích hợp (như trường hợp Unit), nhưng đừng lạm dụng nó. (Và luôn đảm bảo rằng nó được ghi chép đầy đủ!) –

2

Bạn cần cung cấp toán tử truyền cho lớp học có Int32.

+0

chỉnh nhỏ: nó thực sự là một nhà điều hành _conversion_ (xem 10.10.3 trong spec MS) –

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