首页 > 其他分享 >6 用户定义类型转换 运算符重载 typeof运算符

6 用户定义类型转换 运算符重载 typeof运算符

时间:2022-10-29 00:12:13浏览次数:75  
标签:类型转换 LimitedInt int value li 运算符 typeof public

目录

用户定义类型转换

c# 提供隐示转换 和 显示转换

  • 对于隐示转换,当决定在特定上下文中使用特定的类型时,如果有必要,编译器会自动执行转换
  • 对于显示转换,编译器只在使用显示转换运算符时才执行转换

声明隐示转换语法如下。publicstatic 修饰符是所有用户自定义的转换所必须的

// public static 必须的		   目标类型     数据源
public static implicit operator TargetType(sourceType data);

显示转换的语法与之相同,需要用 explicit 替换掉 implicit

下面代码展示声明转换运算符的示例,他把类型LimitedInt 的对象 转换为 int 型,反之亦然

隐示转换

class LimitedInt
{
    private int _value = 0;
    public int Value { 
        get { return _value; } 
        set { this._value = value; } 
    }

    // 将 LimitedInt转换为int
    public static implicit operator int(LimitedInt li)  
    {
        return li.Value;
    }

    // 将int转换成LimitedInt
    public static implicit operator LimitedInt(int x) 
    {
        LimitedInt li = new LimitedInt();
        li.Value = x;
        return li;
    }
}

转换

static void Main(string[] args)
{
    LimitedInt limitedInt = new LimitedInt();
    int res = limitedInt;
    res = 15;
    limitedInt = res;
    Console.WriteLine(limitedInt);
    Console.ReadKey();
}

显示转换

// 显示转换
class LimitedInt2
{
    private int _value = 0;
    public int Value
    {
        get { return _value; }
        set { this._value = value; }
    }

    // 将 LimitedInt转换为int
    public static explicit operator int(LimitedInt2 li)
    {
        return li.Value;
    }

    // 将int转换成LimitedInt
    public static explicit operator LimitedInt2(int x)
    {
        LimitedInt2 li = new LimitedInt2();
        li.Value = x;
        return li;
    }
}
LimitedInt2 limitedInt2 = new LimitedInt2();
int res2 = (int)limitedInt2;
res2 = 15;
limitedInt2 = (LimitedInt2)res2;
Console.WriteLine(limitedInt2.Value);
Console.ReadKey();

另外有两个运行符,接受一种类型的值,并返回另一种不同的,指定类型的值。这就是is运算符合as运算符,我们在后面介绍他

运算符重载

  • 运算符重载只能用于类和结构。
  • 为类或结构重载一个运算符x,可以声明一个名称为operator x的方法并实现他的行为(例如:operator + 或 operator -)
    • 一元运算符的重载方法带一个单独的class或struct类型的参数。
    • 二元运算符的重载方法带两个参数,其中至少有一个必须是class或struct类型。
public static LimitedInt operator - (LimitedInt x);
public static LimitedInt operator + (LimitedInt x,double y);

运算符的方法声明:

  • 声明必须同时使用static 和 public 的修饰符;
  • 运算符必须是要操作的类或结构的成员。
class LimitedInt3
{
    public double value = 0;
    // 二元运算符
    public static LimitedInt3 operator +(LimitedInt3 x, double y)
    {
        LimitedInt3 li = new LimitedInt3();
        li.value = x.value + y;
        return li;
    }

    
    // 一元运算符
    public static LimitedInt3 operator - (LimitedInt3 x)
    {
        LimitedInt3 li = new LimitedInt3();
        li.value = -(x.value);
        return li;
    }
}

使用

LimitedInt3 l3 = new LimitedInt3();
l3.value = 15;
LimitedInt3 l4 = l3 + 10;
Console.WriteLine(l4.value);
l4 = -l4;
Console.WriteLine(l4.value);
Console.ReadKey();

运算符重载的限制

不是所有运算符都能被重载,可以重载的列席也有限制

只有下面这些运算符可以被重载。列表中明显缺少的是赋值运算符

  • 可重载的一元运算符: + - ! ~ ++ -- true false
  • 可重载的二元运算符:+ - * / % & | ^ << >> == != >< >= <=

Typeof 运算符

​ typeof运算符返回作为其参数的任何类型的System.Type对象。 通过这个对象,可以了解类型的特征。(对任何已知类型,只有一个System.Type对象) 不能重载typeof运算符。

运算符 描述
typeof 返回已知类型的System.Type对象

下面是typeof运算符语法的示例,Type是System命名空间中的一个类

Type t = typeof(SomeClass)

下面利用typeof运算符获取SomeClass类的信息,并打印出他的公有字段和方法

using System.Reflection;  // 使用反射命名空间来全面利用检测类型信息的功能

Type t = typeof(LimitedInt);
FieldInfo[] fi = t.GetFields();
MethodInfo[] mi = t.GetMethods();
foreach (var item in fi)
{
    Console.WriteLine("Field : {0}" ,item.Name);
}
foreach (var item in mi)
{
    Console.WriteLine("Method : {0}", item.Name);
}
Console.ReadKey();

结果:

Field : _value
Method : get_Value
Method : set_Value
Method : op_Implicit
Method : op_Implicit
Method : Equals
Method : GetHashCode
Method : GetType
Method : ToString

GetType方法也会调用typeof运算符,该方法对每个类型的每个对象都有效

Console.WriteLine("Type s:{0}",limitedInt.GetType().Name);

标签:类型转换,LimitedInt,int,value,li,运算符,typeof,public
From: https://www.cnblogs.com/lddragon1/p/16837887.html

相关文章

  • Java基础语法与运算符
    Java基础语法数据类型8大基本数据类型整数类型byte1字节short2字节int4字节(整数默认数据类型)long8字节(赋值的字面量结尾要加l或L)浮点数类型float4字节(......
  • MSSQL将时间类型转换为字符串类型
    示例代码如下: SelectCONVERT(varchar(100),GETDATE(),0):0516200610:57AMSelectCONVERT(varchar(100),GETDATE(),1):05/16/06SelectCONVERT(varchar(100),......
  • Newtonsoft.Json将可空类型转换为空字符串(支持所有类型)
    第一步:json自定义解析协议///<summary>///json自定义解析协议///</summary>publicclassSpecialJsonContractResolver:DefaultContractResolve......
  • 3、运算符
    3运算符作用:用于执行代码的运算本章我们主要讲解以下几类运算符:运算符类型作用算术运算符用于处理四则运算赋值运算符用于将表达式的值赋给变量比较......
  • JavaScript中易忘的运算符
    eval()JavaScript通过全局函数eval()可以解释运行由JavaScript源码组成的字符串并且产生一个值。eval("25*4");//==100eval()是一个原本是一个函数,但是已经被当成运算符来......
  • 力扣(leetcode) 342. 4的幂(合理利用运算符)
    题目在这:​​https://leetcode-cn.com/problems/power-of-four/​​题目分析:昨天2的幂,今天4的幂。题目不多说了~按照昨天的思路直接开撸。法一:经过不断的测试,得到以......
  • PHP:变量类型获取和数据类型转换
    (目录)1、获取变量类型<?php//整型$age=23;var_dump(gettype($age));//string(7)"integer"//字符串$name="Tom";var_dump(gettype($name));//string(......
  • C#中的 `true` 和 `false` 运算符
    C#中的true和false运算符基础用法我们先定义一个示例用的类publicclassBoolTest{publicintX{get;set;}publicBoolTest(intx){X=x;}publ......
  • 运算符重载
    #include<iostream>usingnamespacestd;classComplex{public: Complex(){real=0;imag=0;} Complex(doubler,doublei){real=r;imag=i;} doubleget_real(){r......
  • python的一些运算符
    #1.算术运算符print('1.算术运算符')#1.1+求和a=10b=20c=a+bprint(c)print('a+b={}'.format(c))print('a+b=%i'%c)print(f'a+b={c}')#1.2-求......