C# 中使用隐式和显式操作符的示例

目录
  • 什么是显式,什么是隐式
  • 创建 DTO 类
  • Model 和 DTO 之间的相互转换
  • 使用隐式操作符
  • 使用显式操作符

C# 有一个鲜为人知的特性是通过定义 显式和隐式操作符 实现类型之间的转换,这篇文章我们将会讨论如何使用这些 显式 和 隐式 操作符。

什么是显式,什么是隐式

隐式类型转换 它是运行时自动帮你完成的,言外之意就是你不需要人为干预,比如下面的例子就是典型的 隐式类型转换。

int x = 100; 
double d = x;

不过下面的代码则过不了编译器。

double d = 100.25;
int x = d;

编译程序时,将会出现下面的错误。

显而易见,上面的 double 不能隐式的转成 int,除非显式转换,那如何显式呢?可以使用如下代码。

int x = 100; 
double d = (int) x;

人工干预后,编译器也就放行了。

创建 DTO 类

接下来我们研究一下如何在 用户自定义类型 上使用 隐式 和 显式转换,比如:Class,考虑下面的类。

    public class Author
    {
        public Guid Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public class AuthorDto
    {
        public string Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

在上面的代码中,定义了一个 Author 实体类,然后再为 Author 定义一个数据传输对象 AuthorDTO,数据传输对象是一个数据容器,常用于在 Presentation 和 Application层 之间传递数据。

Model 和 DTO 之间的相互转换

下面的代码展示了如何实现 Author 和 AuthorDto 之间的相互转换。

        public AuthorDto ConvertAuthorToAuthorDto(Author author)
        {
            AuthorDto authorDto = new AuthorDto
            {
                Id = author.Id.ToString(),
                FirstName = author.FirstName,
                LastName = author.LastName
            };
            return authorDto;
        }

        public Author ConvertAuthorDtoToAuthor(AuthorDto authorDto)
        {
            Author author = new Author
            {
                Id = Guid.Parse(authorDto.Id),
                FirstName = authorDto.FirstName,
                LastName = authorDto.LastName
            };
            return author;
        }

如果需要在应用程序中为若干个类写这样的转换代码,你会发现实现类之间的转换使的代码比较冗余,而且代码可读性也好不到哪里去。所以在这种场景下就是 显式 和 隐式 操作符的用武之地。

使用隐式操作符

实现 model-dto 之间的转换更简单粗暴的方式就是使用 隐显式操作符,这样就避免了冗长的方法调用,让代码更加的直截了当。

下面的代码展示了如何使用 隐式操作符 将 Author实例 转成 AuthorDto 实例。

public static implicit operator AuthorDto(Author author)
{
  AuthorDto authorDto = new AuthorDto();
  authorDto.Id = author.Id.ToString();
  authorDto.FirstName = author.FirstName;
  authorDto.LastName = author.LastName;
  return authorDto;
}

接下来看一下如何在 Main 方法中使用 隐式操作符。

static void Main(string[] args)
{
   Author author = new Author();
   author.Id = Guid.NewGuid();
   author.FirstName = "Joydip";
   author.LastName = "Kanjilal";
   AuthorDto authorDto = author;
   Console.ReadKey();
}

使用显式操作符

下面的代码展示了如何利用 显式操作符 将 Author 实例转成 AuthorDto 。

public static explicit operator AuthorDto(Author author)
{
  AuthorDto authorDto = new AuthorDto();
  authorDto.Id = author.Id.ToString();
  authorDto.FirstName = author.FirstName;
  authorDto.LastName = author.LastName;
  return authorDto;
}

这时候在 Main 方法中就需要人工介入进行强转了,如下代码所示:

static void Main(string[] args)
{
  Author author = new Author();
  author.Id = Guid.NewGuid();
  author.FirstName = "Joydip";
  author.LastName = "Kanjilal";
  AuthorDto authorDto = (AuthorDto)author;
  Console.ReadKey();
}

值得注意的是,你不能在一个类中的对象转换同时定义 显式 和 隐式操作符,如下图所示:

如果你定义了隐式操作符,那么对象之间的转换可以是隐式或显式,如果你定义了显式操作符,那么你只能显式的实现对象转换,虽然隐式操作使用起来非常方便,但显式操作会让代码意图更明显,可读性更高。

以上就是C# 中使用隐式和显式操作符的示例的详细内容,更多关于C# 中使用隐式和显式操作符的资料请关注我们其它相关文章!

(0)

相关推荐

  • c# 操作符?? null coalescing operator

    我们可以看下下面的这几个示例来看看这个操作符的使用方法: 复制代码 代码如下: string message = "Hello World"; string result = message ?? "null"; //这里的result的内容是 Hello World 再看下面的这个例子子: 复制代码 代码如下: string message = null; string result = message ?? "It's null"; //在这

  • C# 操作符之三元操作符浅析

    C# 操作符之三元操作符"?:"是什么呢? C# 操作符之三元操作符"?:"有时也称为条件操作符. 对条件表达式b?x:y,先计算条件b,然后进行判断. 如果b的值为true,计算x的值,运算结果为x的值:否则,计算y,运算结果为y的值. 一个条件表达式从不会又计算x,也计算y.条件操作符是向右关联的,也就是说,从左向右分组计算. C# 操作符之三元操作符"?:"操作实例: 表达式a?b:c?d:e将按a?b:(C?d:e)形式执行. ?:的第二

  • C#中的is和as操作符区别小结

    1. is 是验证操作对象是不是自己希望的 运算公式:对象  is  类型 返回true:对象是指定类型 返回false:对象不是指定类型 2. as 是将对象转换成指定类型 运算公式:对象 as 类型 转换成功:对象的类型就是指定的类型 转换失败:返回null 注意: The  "is" and "as" operator must be used with a reference type or nullable type (example:'int' is a

  • 不能忽略c#中的using和as操作符的用处

    是不是很多人不用c#中的using和as操作符?甚至不知道?  其实这2个操作符在小处非常有用. 1.using  按照msdn的解释 using 语句定义一个范围,在此范围的末尾将处理对象.  举例: class TestUsing:IDisposable      {          public void Dispose()           {              Console.WriteLine("Dispose");           } public voi

  • C# 操作符之二 算数操作符

    赋值运算符也有和算数操作符所结合的用法之前附录中有提及,用法是:比如要将x加上4,然后再赋值给x,就可以写成x+=4. 复制代码 代码如下: public class MathOps{ public static void main(String [] args){ Random rand=new Random(47); int i,j,k; j=rand.nextInf(100)+1; System.out.println("j:"+j); k=rand.nextInt(100)+1

  • C# 常见操作符整理

    常见的操作符 赋值操作符:= 复合赋值运算符:+=,-=,*=,/=,%= 算数运算符:+,-,*,/,%(ß二元运算符),++,--(ß一元运算符) 条件运算符:>,<,>=,<=,!=,== 逻辑运算符:&&,||,|,! 几乎所有的操作符都只能操作基本数据类型,但是"=","=="和"!=",这些操作符能操作所有的对象.除此以外String类支持"+"和"+="

  • C# 中的??操作符浅谈

    复制代码 代码如下: object nullObj = null; object obj = new Object(); return nullObj ?? obj; // returns obj 主要用作将一个可空类型赋值给不可空类型的简便语法 复制代码 代码如下: int? i = null;int j = i ?? 0; // Unless i is null, initialize j to i. Else (if i is null), initialize j to 0.

  • C# 中使用隐式和显式操作符的示例

    目录 什么是显式,什么是隐式 创建 DTO 类 Model 和 DTO 之间的相互转换 使用隐式操作符 使用显式操作符 C# 有一个鲜为人知的特性是通过定义 显式和隐式操作符 实现类型之间的转换,这篇文章我们将会讨论如何使用这些 显式 和 隐式 操作符. 什么是显式,什么是隐式 隐式类型转换 它是运行时自动帮你完成的,言外之意就是你不需要人为干预,比如下面的例子就是典型的 隐式类型转换. int x = 100;  double d = x; 不过下面的代码则过不了编译器. double d =

  • 在SQL Server数据库中为标识(IDENTITY)列插入显式值

    如果我们在标识列中插入值,例如: insert member(id,username) values(10,'admin') 则在查询分析器里面会返回错误信息:  引用内容 服务器: 消息 544,级别 16,状态 1,行 1 当 IDENTITY_Insert 设置为 OFF 时,不能向表 'member' 中的标识列插入显式值. 而在ASP程序中会返回错误信息:  引用内容 Microsoft OLE DB Provider for SQL Server 错误 '80040e14' 当 ID

  • 深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    synchronized 和 Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两种同步方式.显式锁是JDK1.5引入的,这两种锁有什么异同呢?是仅仅增加了一种选择还是另有其因?本文为您一探究竟. // synchronized关键字用法示例 public synchronized void add(int t){// 同步方法 this.v += t; } public stati

  • JavaScript显式数据类型转换详解

    基本概念 将值从一种类型转换为另一种类型称为类型转换,类型转换总是返回基本类型值,如字符串.数字和布尔值,不会返回引用类型值. 类型转换分为"显式"和"隐式":"显式"转换发生在静态类型语言的编译阶段,而"隐式"转换则发生在动态类型语言的运行时. 显式类型转换 非字符串到字符串的类型转换 toString() 方法 数字.布尔值.字符串和对象都有 toString() 方法,但 null 和 undefined 没有. 例子:

  • sqlsever为标识列指定显式值

    sqlsever为标识列指定显式值的问题,大多是大家在两个结构完全相同的表,由其中一个表插入另一个表中指定条件的数据,报如下错误: 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'*'中的标识列指定显式值. 在网上找到了解决方案,亲自试过,可以解决. 一.问题详述如下: 系统:windows2003 数据库:2005 数据库实例:wzgl2004 和wzgl2003,这两个实例都有表kc 执行语句 insert into wzgl2004.dbo.kc select

  • sqlserver为标识列指定显式值

    sqlsever为标识列指定显式值的问题,大多是大家在两个结构完全相同的表,由其中一个表插入另一个表中指定条件的数据,报如下错误: 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'*'中的标识列指定显式值. 在网上找到了解决方案,亲自试过,可以解决. 一.问题详述如下: 系统:windows2003 数据库:2005 数据库实例:wzgl2004 和wzgl2003,这两个实例都有表kc 执行语句 insert into wzgl2004.dbo.kc select

  • 详解C#中对于接口的实现方式(隐式接口和显式接口)

    C#中对于接口的实现方式有隐式接口和显式接口两种: 隐式地实现接口成员 创建一个接口,IChinese,包含一个成员 Speak;我们创建一个类Speaker,实现接口Chinese //隐藏式实现例子 public interface IChinese { string Speak(); } public class Speaker : IChinese { public string Speak() { return "中文"; } } 这个就是隐式实现接口. 隐式实现调用方法如下

  • C++11中模板隐式实例化与显式实例化的定义详解分析

    目录 1. 隐式实例化 2. 显式实例化声明与定义 3. 显式实例化的用途 1. 隐式实例化 在代码中实际使用模板类构造对象或者调用模板函数时,编译器会根据调用者传给模板的实参进行模板类型推导然后对模板进行实例化,此过程中的实例化即是隐式实例化. template<typename T> T add(T t1, T2) { return t1 + t2; } template<typename T> class Dylan { public: T m_data; }; int ma

  • 详解Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的emp表) -- sql%rowcount:影响记录条数 sql%found:是否有满足条件的记录 set serveroutput on; declare v_ename a_emp.ename%type; begin select ename into v_ename from a_emp whe

  • python 参数列表中的self 显式不等于冗余

    self在区分全局变量/函数和对象中的成员变量/函数十分有用.例如,它提供了一种作用域机制,我个人认为比Ruby的@和@@清晰多了,这可能是习惯使然吧,但它确实和C++.Java中的this很相似. 然而,self总是有令我困扰的地方,我以前在这里说过-我曾幻想能在Python3中这些能得以改进,然后通常会引发一轮热议并最终以人们所说的"显胜于隐"告终. 我在巴西的时候曾和Luciano Ramalho(巴西Python组织的主席)有过一次交谈.他让我明白并非无处不在的self让我困扰

随机推荐