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));
    }

}
时间: 2024-10-09 20:31:51

C#一元运算重载的深入理解的相关文章

一段代码引起的对C++构造函数、析构函数,复制构造函数,运算符重载的深度理解

代码和解释: #include "stdafx.h" #include <stdio.h> #include <string> #include <iostream> using namespace std; class test{ int *p; public: test(int value){ p = new int(value); cout<<"Execute Constructor>>"<&l

17.C#类型判断和重载决策(九章9.4)

今天来结束第九章,聊下我们经常忽略,但是编译器会帮我们完成的"类型判断和重载决策",理解编译器如何帮我们完成,相信在写代码时会更明确,避免一些编译出错,排查的问题,让我们开发更给力. 我们知道隐式类型的数组以及将方法组转换为委托类型都需要类型推断,但将方法组作为其它方法的参数进行转换时,会显得极其复杂,我们由浅入深,一步一步来看,编译器是如何帮我们做的一些推断. 1 //定义一个泛型方法,参数分别为TInput类型和一个Func<TInput, TResult>类型的委托

java重载(实现同一方法名,不同参数)

背景: 前几天写连接数据库时,因为要执行sql,有的是指向得到所有的执行结果,有的是想根据执行结果获得某一个字段的结果.这时我想通过同一个方法名,不同的参数,获得不同的结果.结果发现java的方法竟然不能对参数设置默认值==,而是可以通过重载来实现这个过程的.(当然不排除我对java不了解的缘故,如果大家有什么方法可以告诉我谢谢~) 重载:可以理解为同一个方法名,不同的参数,大概的实例如下: def void A(int i){ #使用参数i的方法A } def void A(int j,int

C++学习笔记之模板(1)——从函数重载到函数模板

一.函数重载 因为函数重载比较容易理解,并且非常有助于我们理解函数模板的意义,所以这里我们先来用一个经典的例子展示为什么要使用函数重载,这比读文字定义有效的多. 现在我们编写一个交换两个int变量值得函数,可以这样写: 1 void swap(int & a, int & b) 2 { 3 int tmp; 4 5 tmp = a; 6 a = b; 7 b = tmp; 8 9 } 假如我们现在想在与上面函数相同的文件中(可以理解为同一个main函数中)交换两个float变量呢,是不是需

Scala学习笔记(1)-- 运算符重载

本文记录我对Scala语言运算符重载的一些理解. 运算符=方法 对于Scala来说,运算符就是普通的方法(再配上一些语法糖).比如下面这个类就重载了加号和减号: 我们可以这样使用MyInt: var myInt = new MyInt(1) myInt = myInt + 1 用javap或者classpy分析一下scalac编译之后的类可以知道,+实际上对应$plus()方法,-对应$minus()方法.也就是说,下面三行代码完全等价: myInt = myInt + 1 myInt = my

在js中arguments对象的理解

一.在函数调用的时候,浏览器每次都会传递进两个隐式参数 函数的上下文对象this 封装实参的对象arguments 二.arguments 对象 arguments 对象实际上是所在函数的一个内置类数组对象 每个函数都有一个arguments属性,表示函数的实参集合,这里的实参是重点,就是执行函数时实际传入的参数的集合.arguments不是数组而是一个对象,但它和数组很相似,所以通常称为类数组对象,以后看到类数组其实就表示arguments.arguments对象不能显式的创建,它只有在函数开

对象的初始化与清理

随着计算机革命的发展,"不安全"的编程方式已经逐渐成为了编程代价高昂的主因之一. 正确的初始化和清理过程对于程序的安全性和性能至关重要,不同的编程语言对此具有不同的处理机制.C++中利用构造器完成初始化,当对象不再被使用时调用析构函数完成销毁,程序员需要手动完成内存释放管理过程:Java也采用了构造器完成初始化,同时提供了垃圾会收器对不再使用的内存资源进行自动管理,减轻了程序员管理手动管理内存的编程负担. 1 重载 Java(和C++)中,构造器是强制重载方法名的原因之一.因为构造器常

JS高级程序设置笔记(二)

5.4 RegExp类型 用这个类来表示正则表达式. var expression = /pattern/flags; pattern部分是任何简单的或者复杂的正则:每一个正则都有一个或者多个标志. 正则表达式匹配模式下支持下列3个标示 1:g 全局模式 2:i 不区分大小写 3:m 表示多行 5.4.1RegExp实例属性: 1:global:布尔值,表示是否设置了g标志. 2:ignoreCase:布尔值:表示是否设置了i标志 3:lastIndex:整数,表示开始搜索下一个匹配的字符位置,

C++笔记(仅C++特性,需C语言基础)

C++复习笔记一(类的声明定义应用与构造函数析构函数部分)const在C语言中是"不能被改变值的变量",而在C++种子则是"一种有类型描述的常量",常量必须初始化,并且不可以改变const int *P=15;const 在*的左边,所以*p是常量,不可以改变int * const p=15;const在*的右边,所以p是常量,但是*p不是,*p是int型,*p的值可以改变const型的引用只能用const型,不能用普通类型来引用,因为普通类型引用可能会修改cons