zoukankan      html  css  js  c++  java
  • C#一元运算重载的深入理解

    using System;
    using System.Diagnostics;
    using System.Text;
    using System.Collections;
    using System.Collections.Generic;
    delegate string DTE(int x, string s);
    
    class MYTestX
    {
        public class CDT
        {
            public CDT(int x)
            {
                this.x = x;
            }
            int x = 10;
    
            //类型转换只能是public static implicit形式或public static explicit形式
            //,这里的implicit与explicit并不是返回值类型,而是修饰符,说明是隐式转换还是显式转换
            //因此不能写成public static bool operator bool(CDT odt)这样的形式,编译会出错
            //应用场景 
            //1: CDT ot = new CDT(); if(ot){}
            //2: CDT ot = new CDT(); bool b = ot;
            public static implicit operator bool(CDT odt)
            {
                Console.WriteLine("operator bool------------------");
    
                return odt != null;
            }
            //应用场景:
            //CDT ot = new CDT(); string s = (string) ot
            public static explicit operator string(CDT odt)
            {
                Console.WriteLine("operator string------------------");
                return odt.ToString();
            }
            //应用场景:
            //CDT ot = new CDT(); string s = ot
            public static implicit operator int(CDT odt)
            {
                Console.WriteLine("operator string------------------");
                return odt.x;
            }
    
            //重载 true false运算符(注意的MSDN文档说明中说true和false是运算符,就像 +,-普通运算符一样)
            //两者必须一起重载。其实就相当于重载一个bool运算符的效果, 并不完全等价
            //应用场景:
            //CDT ot = new CDT(); if(ot){}
            //不能用于: CDT ot = new CDT();  bool b = ot; bool b2 = (bool)ot;
            public static bool operator true(CDT odt){
    
                return odt != null;
            }
            public static bool operator false(CDT odt)
            {
    
                return odt == null;
            }
        }
        class CDTX { }
    
        //public void TestLimitX(CDTX ot)//编译错误:CDTX的访问权限不能小于TestLimitX的访问权限
        //{
        //}
        public static void TestLimit(CDT ot)//可以访问
        {
            if (ot) { }//调用operator ture
            bool b = ot;//调用operator bool,若无此重载,则编译错误,并不会调用operator ture 或ooperator false
            string st = (string)ot; //可以转换,调用重载的显示的string转换运算符
            CDTX otx = new CDTX();
            //string stx = (string)otx; //编译出错,不能转换
            Console.WriteLine(b);
        }
        static void Main(string[] args)
        {
            TestLimit(new CDT(112));
        }
    
    }
  • 相关阅读:
    [C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数
    [C#] C# 知识回顾
    [C#] C# 知识回顾
    [C#] C# 知识回顾
    [C#] C# 知识回顾
    [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
    [C#] 简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)
    [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
    [C#] 简单的 Helper 封装 -- RandomHelper
    [C#] 简单的 Helper 封装 -- CookieHelper
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/6056673.html
Copyright © 2011-2022 走看看