如何在C#中使用隐式和显式运算符

利用隐式和显式运算符在用户定义的类型之间进行转换,并提高代码的可读性。

C#鲜为人知的功能之一是能够创建用户定义的隐式和显式类型转换,这意味着我们支持从一种类型到另一种类型的隐式和显式转换。我们还具有显式和隐式运算符,这意味着某些运算符需要显式强制转换,而某些运算符则不需要。

本文讨论了这些显式和隐式转换运算符,以及如何在C#中使用它们。若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。如果您还没有副本,则可以在此处下载Visual Studio 2019

在Visual Studio中创建控制台应用程序项目

首先,让我们在Visual Studio中创建一个.NET Core控制台应用程序项目。假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建一个新的.NET Core控制台应用程序项目。

  1. 启动Visual Studio IDE。
  2. 点击“创建新项目”。
  3. 在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。
  4. 点击下一步。
  5. 在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。
  6. 单击创建。

完成这些步骤后,将在Visual Studio 2019中创建一个新的.NET Core控制台应用程序项目。我们将在本文的后续部分中使用该项目。如何在C#中使用隐式和显式运算符 

什么是隐式和显式类型转换

隐式类型转换是运行时自动完成的转换。您无需强制转换为任何特定类型。这是说明隐式转换的示例:

int x = 100; 
double d = x;  

但是,请注意,以下代码将无法编译。

double d = 100.25;
int x = d;; 

这是您在Visual Studio中编译上述代码段时将看到的错误。

csharp隐式转换错误
图1.编译器不允许您在C#中将double分配给整数变量。

该错误表明运行时不会在没有显式类型转换的情况下将double转换为int。这种类型转换类型称为显式类型转换,因为您必须编写显式代码才能执行类型转换。

您可以通过指定一个将double转换为int的显式类型强制转换来修复不可编译的代码片段,如下面的代码片段所示。

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

上面的代码将成功编译,没有任何错误。

在C#中创建模型和DTO类

现在让我们了解如何在用户定义的数据类型(即类)中使用隐式和显式转换。

考虑以下两个类。

  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类表示Author类的数据传输对象。数据传输对象是用于在应用程序的各层之间传递数据的数据容器。

在C#中将模型转换为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;
        }     

如果您需要为应用程序中的多个类编写此类转换代码,则不仅会觉得麻烦,而且您的代码也不会具有适当的可读性。这就是隐式和显式转换运算符出现的地方。

在C#中使用隐式转换运算符

实现上述模型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;
}

这是使用隐式运算符将Author实例转换为AuthorDto实例的方法:

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

在C#中使用显式转换运算符

以下代码段显示了如何利用显式运算符将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;
}

在这种情况下,您将需要进行显式转换,以将Author实例转换为AuthorDto实例,如下面的代码片段所示。

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

请注意,您不能在类中同时定义隐式和显式运算符。如果定义了隐式运算符,则可以隐式和显式转换对象。但是,如果定义了显式运算符,则仅能显式转换对象。这就解释了为什么在类中不能同时具有隐式和显式运算符的原因。尽管隐式强制转换更易于使用,但显式强制转换可提高代码的清晰度和可读性。

原创文章,作者:冰封一夏,如若转载,请注明出处:http://www.nncjzx.com/1367.html

关注本站公众号获取更多实时内容

本站微信公众号:二线码农