C# 精通之路 —— 三大方法详解(转换操作符方法、扩展方法、分部方法),这些细节知识你知多少?

作者:浪子花梦一个有趣的程序员 ~
前言,原本没想过写这些文章的,但是当时学C++的时候没有总结过这些知识,与细节的地方,而且C# 增加了扩展方法与访问方法,所以我觉得有必要在这里作出一下分享(C++ 可能也有吧,很久不关注了) . . .
此文章参考 《CLR via C#》、度娘 . . .


文章目录

  • 转换操作符方法详解
  • 扩展方法
  • 访问方法

此文章代码不长,主要给大家唤醒一下沉睡的记忆 ~

.

C# 精通之路 —— 三大方法详解(转换操作符方法、扩展方法、分部方法),这些细节知识你知多少?_第1张图片


转换操作符方法详解

当我在实际操作中,将一种类型转换为另一种类型时,就需要类型的转换,而类型的转换也分为两种转换方式,他们分别是:

  1. 隐式转换
  2. 显示转换

如果没有了解过这种情况的朋友,可以看一下下面的代码,我相信你们肯定在写代码的过程遇到过的:

Single num1 = 250;
Int32 num2 = (Int32)250.5;

Console.WriteLine(num1.GetType());		// 输出 Single
Console.WriteLine(num2.GetType());		// 输出 Int32

第一行就是隐式转换,第二行是显示转换,为什么会有这样的区分呢?
答案是当我们确定不丢失精度的时候选择隐式转换,可能会丢失精度的时候选择显式转换 . . .

.
下面我们来实现一下对象的定义之中,是如何实现这些细节的处理,隐式与显式是如何书写出来的呢?

假如我们有一个叫 Rational(有理数)类型,并且像上面的代码一样,将 Int32与 Single 转换为 Rational 就会非常的方便,反之也是一样的 . . .

代码如下所示(其中会定义四个方法,有两个是构造方法):

public sealed class Rational
{
     
    public Rational(Int32 num) {
      }
    
    public Rational(Single num) {
      }
    
    public Int32 ToInt32() {
      return 20; }
    
    public Single ToSingle() {
      return 20f; }
}

这些方法在下面的隐式、显式方法之中会有所用到:

隐式构造方法,接收一个基元类型,返回一个 Rational:

// 隐式转换
public static implicit operator Rational(Int32 num)
{
     
	return new Rational(num);
}

public static implicit operator Rational(Single num)
{
     
	return new Rational(num);
}

显式构造方法,接收一个 Rational,显示返回一个类型:

// 显示转换
public static explicit operator Int32(Rational r)
{
     
    return r.ToInt32();
}

public static explicit operator Single(Rational r)
{
     
    return r.ToSingle();
}

当我们把这个类设计好了之后,我们就可以来测试下面的代码了,如下所示:

// 转换操作符
Rational r1 = 20;			// Int32 隐式转换为 

Rational r2 = 2.5f;			// Single 隐式转换为 Rational

Int32 x = (Int32)r1;		// Rational 显式转型为 Int32

Single y = (Single)r2;		// Rational 显式转型为 Single

这样对于我们就非常的友好了,那么我们这里有一个问题, 这些转换方法的名称在 内部是什么呢? C# 是如何自动判断出来的? 我们打开反编译工具 ILDASM 查看 Rational 中的元数据:
C# 精通之路 —— 三大方法详解(转换操作符方法、扩展方法、分部方法),这些细节知识你知多少?_第2张图片
我们可以看出,将对象从一种类型转换成另一种类型的方法问题被叫做 op_Explicit 或者 op_Implicit . . .
而且我们也在上面说过:不丢失精度的时候选择隐式转换,可能会丢失精度的时候选择显式转换 . . .

.


扩展方法

在实则的应用中,如果我们想给一个本身不存在某一个功能的类添加一个新的功能,那么这时我们就可以使用扩展方法,扩展方法的使用很简单,比如下面这个例子:

我们为 String这个类添加一个名为 SayHello的方法
C# 精通之路 —— 三大方法详解(转换操作符方法、扩展方法、分部方法),这些细节知识你知多少?_第3张图片
扩展方法的语法格式很简单,静态类里面的静态方法,命名规则以 Extensions结尾(自愿情况),其中方法的第一参数为 需要扩展的类型前加 this. . .

现在我们可以为 String类的对象使用这个方法,使用如下所示:
C# 精通之路 —— 三大方法详解(转换操作符方法、扩展方法、分部方法),这些细节知识你知多少?_第4张图片
效果如下所示:
C# 精通之路 —— 三大方法详解(转换操作符方法、扩展方法、分部方法),这些细节知识你知多少?_第5张图片

.


分部方法

分部方法定义相关如下所示:
C# 精通之路 —— 三大方法详解(转换操作符方法、扩展方法、分部方法),这些细节知识你知多少?_第6张图片

两个不同的文件来展示分部方法:
在这里插入图片描述

我们在 Test1 类中写下如下的代码:
C# 精通之路 —— 三大方法详解(转换操作符方法、扩展方法、分部方法),这些细节知识你知多少?_第7张图片
方法 OnNameChanging 没有提供实现部分,而我们可以在另一个文件 Test2中实现这个方法 . . .

Test2 代码如下所示:
C# 精通之路 —— 三大方法详解(转换操作符方法、扩展方法、分部方法),这些细节知识你知多少?_第8张图片


点个赞呗 ~

你可能感兴趣的:(C#,精通之路,C#,转换操作符,扩展方法,分部方法,核心知识)