2012-04-25 76 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