zoukankan      html  css  js  c++  java
  • C# 自己定义 implicit和explicit转换

    explicit 和 implicit 属于转换运算符,如用这两者能够让我们自己定义的类型支持相互交换
    explicti 表示显式转换。如从 A -> B 必须进行强制类型转换(B = (B)A)
    implicit 表示隐式转换,如从 B -> A 仅仅需直接赋值(A = B)

    隐式转换能够让我们的代码看上去更美丽、更简洁易懂,所以最好多使用 implicit 运算符。只是!假设对象本身在转换时会损失一些信息(如精度),那么我们仅仅能使用 explicit 运算符,以便在编译期就能警告客户调用

    namespace OperatorTest
    {
        /// <summary>
        /// 猪
        /// </summary>
        public class Pig
        {
            public Pig(string name)
            {
                this.Name = name;
            }
            public string Name;
    
            //explicit keyword用于声明必须使用强制转换来调用的用户定义的类型转换运算符。
            //static explicit operator target_type { source_type identifier }
            //target_type 目标类型
            //source_type 源类型
            //identifier Something
            /*转换运算符将源类型转换为目标类型。源类型提供转换运算符。与隐式转换不同。必须通过强制转换的方式来调用显式转换运算符。假设转换操作可能导致异常或丢失信息,则应将其标记为 explicit。

    这能够防止编译器无提示地调用可能产生无法预见后果的转换操作*/ public static implicit operator Pig(Monkey value) { Pig mk = new Pig(value.Name + ":猴子变猪!!"); return mk; } }

    namespace OperatorTest
    {
        /// <summary>
        /// 猴子
        /// </summary>
        public class Monkey
        {
            public Monkey(string name)
            {
                this.Name = name;
            }
            public string Name;
    
            //implicit keyword用于声明隐式的用户定义类型转换运算符。
            //static implicit operator target_type { source_type identifier }
            public static explicit operator Monkey(Pig value)
            {
                Monkey mk = new Monkey(value.Name + ":猪变猴子!!

    "); return mk; } }

    调用:

     Monkey monkey = new Monkey("悟空");
                //隐式转换 猴子变猪
                Pig monkeyToPig = monkey;
                MessageBox.Show(monkeyToPig.Name);
    
                Pig pig = new Pig("八戒");
                //显式转换 猪变猴子
                Monkey pigToMonkey = (Monkey)pig;
                MessageBox.Show(pigToMonkey.Name);

    输出:



    应用:
    比方在实际操作中将一个对象A(或者一个实体)序列化成xml进行存储。那么能够在该对象A的类中定义一个explicit operator,来实现将符合要求的xml内容转换为对象或者实体。
    当然也能够在对象A的类中定义一个函数来实现这个处理,只是这样有可能会多出一步,那就是当该函数不是静态函数时,须要先实例化该对象来调用对应的处理函数。


    參考:

    explicit keyword

    implicit keyword

    operator keyword


    demo下载

  • 相关阅读:
    spring security 单一账户多地方登陆提醒, ajax 拦截器 Interceptor
    Maven 项目打包发布
    jQuery使用on()绑定动态生成元素的事件无效
    ie下li标签中span加float:right不换行问题解决方案
    IE使用多彩文档上传数据库报错
    对象数组中删除指定元素
    jquery 文本框内容清空
    SQL删除重复数据方法
    静态数据的初始化
    java变量初始化顺序
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5261791.html
Copyright © 2011-2022 走看看