利用隐式和显式运算符在用户定义的类型之间进行转换,并提高代码的可读性。
C#鲜为人知的功能之一是能够创建用户定义的隐式和显式类型转换,这意味着我们支持从一种类型到另一种类型的隐式和显式转换。我们还具有显式和隐式运算符,这意味着某些运算符需要显式强制转换,而某些运算符则不需要。
本文讨论了这些显式和隐式转换运算符,以及如何在C#中使用它们。若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。如果您还没有副本,则可以在此处下载Visual Studio 2019。
在Visual Studio中创建控制台应用程序项目
首先,让我们在Visual Studio中创建一个.NET Core控制台应用程序项目。假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建一个新的.NET Core控制台应用程序项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。
- 点击下一步。
- 在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
完成这些步骤后,将在Visual Studio 2019中创建一个新的.NET Core控制台应用程序项目。我们将在本文的后续部分中使用该项目。
什么是隐式和显式类型转换?
隐式类型转换是运行时自动完成的转换。您无需强制转换为任何特定类型。这是说明隐式转换的示例:
int x = 100; double d = x;
但是,请注意,以下代码将无法编译。
double d = 100.25; int x = d;;
这是您在Visual Studio中编译上述代码段时将看到的错误。

该错误表明运行时不会在没有显式类型转换的情况下将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
关注本站公众号获取更多实时内容