Toán tử ẩn


157

Gần đây tôi đã tìm thấy mã này:

 public static implicit operator XElement(XmlBase xmlBase)
 {
     return xmlBase.Xml;
 }

static implicit operatornghĩa là gì?

Câu trả lời:


260

Đây là một toán tử chuyển đổi . Nó có nghĩa là bạn có thể viết mã này:

XmlBase myBase = new XmlBase();
XElement myElement = myBase;

Và trình biên dịch sẽ không phàn nàn! Khi chạy, toán tử chuyển đổi sẽ được thực thi - chuyển myBasevào làm đối số và trả về XElementkết quả hợp lệ .

Đó là một cách để bạn là nhà phát triển nói với trình biên dịch:

"mặc dù chúng trông giống như hai loại hoàn toàn không liên quan, nhưng thực sự có một cách để chuyển đổi từ loại này sang loại khác; hãy để tôi xử lý logic để làm điều đó."


11
+1. Tôi sẽ nói thêm rằng mặc dù thỉnh thoảng có những cách sử dụng tốt để chuyển đổi ngầm định, nó cũng có thể gây ra những lỗi lạ / đáng ngạc nhiên và có thể gây nhầm lẫn cho người dùng API (người). Ví dụ, có rất ít cách sử dụng chuyển đổi ngầm trong BCL. Sử dụng một cách thận trọng!
Drew Noakes

13

Một toán tử ẩn như vậy có nghĩa là bạn có thể chuyển đổi XmlBasethành XElementngầm định.

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;

chuyển đổi rõ ràng này có thể làm việc nào? XElement xelement = (XElement)xmlBase;Trong câu hỏi nó nói static, cái gì phải tĩnh? Nó không thể là tĩnh, vì vậy nó có thể được khởi tạo?
tham vọng

6

Một cách sử dụng thú vị khác là (mà Unity đã làm để kiểm tra xem một đối tượng (và do đó là một thể hiện của MonoBehavior) là null):

public static implicit operator bool (CustomClass c)
{
    return c != null;
}

Lưu ý rằng mã phải nằm trong lớp (CustomClass trong trường hợp này). Bằng cách đó bạn có thể làm một cái gì đó như thế này:

void Method ()
{
    CustomClass c1 = null;
    CustomClass c2 = new CustomClass ();

    bool b1 = c1; // is false
    bool b2 = c2; // is true

    if (!c1 && c2)
    {
        // Do stuff
    }
}

Rõ ràng việc sử dụng khét tiếng nhất có thể là sử dụng nó để chuyển đổi một trong các lớp của bạn sang một lớp khác. Nhưng sử dụng chúng với các loại cơ bản cũng đáng để xem xét ... và tôi thấy nó hiếm khi được đề cập.


1
Bí quyết đẹp! Một điều cần lưu ý: các static implicit operator boolphương pháp phải được khai báo bên trong các CustomClass. Tôi đã tạo một DotNetFiddle cho mục đích demo.
Matt

1
@Matt - Ah, bây giờ câu trả lời của tôi đã được 2 tuổi. Tôi đã cập nhật mã một chút và thêm gợi ý của bạn.
Trận chiến

4

Đó là một toán tử chuyển đổi ẩn (trái ngược với toán tử tường minh, yêu cầu (type)cú pháp chuyển đổi)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.