.net运算符重载?类型转换运算符,它的工作原理是什么?
我在.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,但无法得到确切的想法。
这是从string
到AccessToken
的隐式转换。所以,你可以写:
string foo = "asdasd";
AccessToken token = foo;
这将调用第二部件 - 隐式转换操作符。如果没有这个代码,上面的代码就不会编译,因为string
到AccessToken
之间没有可用的转换。
我个人建议你是非常小心隐式转换 - 他们可以使代码更难以理解。只是偶尔他们可以是非常有用的(LINQ to XML弹出脑海),但我通常只会去与构造函数或静态工厂方法。
隐式运算符允许您将A
类型的实例指定为类型B
,并使用类型A
中定义的转换。
它可以简化您的代码一点,因为您不必调用转换方法等,但可以键入B b = new A();
即使A
不继承B
。
我认为它倾向于引入混淆,但更喜欢更明确的转换和转换。
有点帮助。这到底是什么? 公共静态明确经营者的DateTime(XDateTime emptyDateTime) { 如果(emptyDateTime.IsEmpty) { 抛出新的InvalidOperationException异常( “日期时间为空”); } return emptyDateTime.dateTime; } – Pritesh 2012-04-25 07:10:44
它会使用'XDateTime'对象上的'dateTime'字段将'XDateTime'转换为'DateTime'(或者如果'XDateTime'为空则抛出异常。) 它允许赋值如'DateTime dt =新的XDateTime xdt();' – faester 2012-04-25 08:24:28
要做这样的事情“AccessToken令牌= foo”我想我们必须重载=运算符。 – Pritesh 2012-04-25 06:38:46
@Pritesh你不能在C#中重载'='。反正它有些不同。它还允许您将一个字符串传递给一个具有'AccessToken'作为参数的方法。 – CodesInChaos 2012-04-25 06:40:33
@Pritesh:你不应该从Google的业余爱好中推断Google对技术的使用。你在想什么? – 2012-04-25 06:41:48