review——C# (10)用户定义的类型转换和重载


FROM P169

Part1 用户定义的类型

  用户定义的转换将在以后详细介绍,不过由于它们是运算符,在此先提一下。

□可以为自己的类和结构定义隐式转换和显式转换。这云讯把用户定义类型的对象转换成某个其他类型,反之亦然。

□C#提供隐式转换和显示转换。

--对于隐式转换,当决定在特定上下文中使用特定类型时,如有必要,编译器会自动执行转换。

--对于显式转换,编译器只在使用显式转换运算符时才执行转换。

声明隐式转换的语法如下。public和static修饰符是所有用户定义的转换所必需的。显式转换的语法与之相同,但要用explicit替换掉implicit。

1     public static implicit operator TargetType(SourceType Identifier)
2     {
3         ……
4         return ObjectOfTargetType;
5     }

具体示例:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace review
 8 {
 9     class LimitedInt
10     {
11         const int MaxValue = 100;
12         const int MinValue = 0;
13         public static implicit operator int (LimitedInt li)     //将LimitedInt转换为int
14         {
15             return li.TheValue;
16         }
17         public static implicit operator LimitedInt(int x)       //将int转换为LimitedInt
18         {
19             LimitedInt li = new LimitedInt();
20             li.TheValue = x;
21             return li;
22         }
23         /*
24          * 显式类型转换部分
25         public static explicit operator int(LimitedInt li)     //显式将LimitedInt转换为int
26         {
27             return li.TheValue;
28         }
29         public static explicit operator LimitedInt(int x)       //显式将int转换为LimitedInt
30         {
31             LimitedInt li = new LimitedInt();
32             li.TheValue = x;
33             return li;
34         }
35         */
36         private int _thevalue = 0;
37         public int TheValue
38         {
39             get { return _thevalue;}
40             set
41             {
42                 if (value < MinValue)
43                     _thevalue = 0;
44                 else
45                     _thevalue = value > MaxValue ? MaxValue : value;
46             }
47         }
48     }
49     class Program
50     {
51         static void Main(string[] args)
52         {
53             LimitedInt li = 500;//将500转换为LimitedInt
54             int value = li;//将LimitedInt转换为int
55             Console.WriteLine("li:{0},value: {1}", li.TheValue, value);
56             Console.Read();
57         }
58     }
59 }
60 /*
61  * 输出如下:
62  * li:100,value: 100
63  * */

无法同时对一种转换声明显式和隐式。如果声明为了explicit,则每次实行转换时都必须显式使用转换运算符。

e.g. LimitedInt li=(LimitedInt)500;

另外有两个运算符,接受一种类型的值,并返回另一种不同的,指定类型的值。就是is运算符和as运算符,将在以后提到。

Part2 运算符重载

□运算符重载只能用于类和结构。

□为类或结构重载一个运算符x,可以声明一个名称为operator x的方法并实现它的行为(例如: operator +和operator -等)。

一元运算符的重载方法带一个单独的class或struct类型的参数。

二元运算符的重载方法带两个参数,其中至少有一个必须是class或struct类型。

例子:

1         public static LimitedInt operator - (LimitedInt x)
2         public static LimitedInt operator + (LimitedInt x,double y)

运算符重载不能做下面的事情:

□创建新运算符

□改变运算符的语法

□重新定义运算符如何处理预定义类型

□改变运算符的优先级和结合性

优质内容筛选与推荐>>
1、建立二叉排序树
2、BS程序代码与安全与基本攻击/防御模式
3、NetBeans 时事通讯(刊号 # 142 - Apr 14, 2011)
4、IDEA 项目端口占用处理方法
5、如何的keil试试调试中,看逻辑分析仪Logic viwer


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn