2012-04-25 26 views
2

我在.Net中首次遇到運算符重載問題,早已將它用在C++中,但那就像超載運算符(如「+」),現在我突然想到如下所示。.net運算符重載?類型轉換運算符,它的工作原理是什麼?

我有一個結構AccessToken

[StructLayout(LayoutKind.Sequential)] 
public struct AccessToken : IConvertible 
{ 
    private string _value; 
    public AccessToken(string encodedAccessToken) 
    { 
     this._value = encodedAccessToken; 
    } 

    public static implicit operator AccessToken(string encodedAccessToken) 
    { 
     return new AccessToken(encodedAccessToken); 
    } 
} 

我明白了第一種方法是構造函數,但我不知道究竟:第二個是幹什麼的?肯定有某種操作符重載。我讀http://msdn.microsoft.com/en-us/library/s53ehcz3(v=vs.71).aspx,但無法得到確切的想法。

回答

1

這是從stringAccessToken的隱式轉換。所以,你可以寫:

string foo = "asdasd"; 
AccessToken token = foo; 

這將調用第二部件 - 隱式轉換操作符。如果沒有這個代碼,上面的代碼就不會編譯,因爲stringAccessToken之間沒有可用的轉換。

我個人建議你是非常小心隱式轉換 - 他們可以使代碼更難以理解。只是偶爾他們可以是非常有用的(LINQ to XML彈出腦海),但我通常只會去與構造函數或靜態工廠方法。

+0

要做這樣的事情「AccessToken令牌= foo」我想我們必須重載=運算符。 – Pritesh 2012-04-25 06:38:46

+1

@Pritesh你不能在C#中重載'='。反正它有些不同。它還允許您將一個字符串傳遞給一個具有'AccessToken'作爲參數的方法。 – CodesInChaos 2012-04-25 06:40:33

+0

@Pritesh:你不應該從Google的業餘愛好中推斷Google對技術的使用。你在想什麼? – 2012-04-25 06:41:48

0

隱式運算符允許您將A類型的實例指定爲類型B,並使用類型A中定義的轉換。

它可以簡化您的代碼一點,因爲您不必調用轉換方法等,但可以鍵入B b = new A();即使A不繼承B

我認爲它傾向於引入混淆,但更喜歡更明確的轉換和轉換。

+0

有點幫助。這到底是什麼? 公共靜態明確經營者的DateTime(XDateTime emptyDateTime) { 如果(emptyDateTime.IsEmpty) { 拋出新的InvalidOperationException異常( 「日期時間爲空」); } return emptyDateTime.dateTime; } – Pritesh 2012-04-25 07:10:44

+0

它會使用'XDateTime'對象上的'dateTime'字段將'XDateTime'轉換爲'DateTime'(或者如果'XDateTime'爲空則拋出異常。) 它允許賦值如'DateTime dt =新的XDateTime xdt();' – faester 2012-04-25 08:24:28