C#---第二十: partial修饰类的特性及应用

0.知识背景

局部类型适用于以下情况:

  • 类型特别大,不宜放在一个文件中实现。
  • 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。
  • 需要多人合作编写一个类

局部类型的限制:

  • 局部类型只适用于类、接口、结构,不支持委托和枚举。
  • 同一个类型的各个部分必须都有修饰符 partial。
  • 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。
  • 一个类型的各个部分必须被同时编译。

局部类型的注意点:

  • 关键字partial是一个上下文关键字,只有和 class、struct、interface 放在一起时才有关键字的含义。因此partial的引入不会影响现有代码中名称为partial的变量。
  • 局部类型的各个部分一般是分开放在几个不同的.cs文件中,但C#编译器允许我们将他们放在同一文件中。


1. 代码结构介绍 & 校验的功能

  • 4个不同目录下面的partial 类,校验是否可以都被调用到不同类中独有的方法(Fun() 、Fun2()、Fun3()、Fun5() )
  • 在一个partial 类(SmallClass)中定义变量int,校验其他类中是否可以调用改变量
    C#---第二十: partial修饰类的特性及应用_第1张图片


2.代码部分

AnotherClass.cs


using System.Reflection;

namespace ConsoleDeomAlien.MultiClass
{
    public partial class NormalClass
    {
        private const string name3 = "alien3";

        public void Fun3()
        {
            string methodName = MethodBase.GetCurrentMethod().Name;
            Console.WriteLine($"{className}----{methodName}-----{name3}\n");
        }
    }
}




NormalClass.cs


using System.Reflection;

namespace ConsoleDeomAlien.MultiClass
{
    public partial class NormalClass
    {
        private const string name = "alien";
        string className = MethodBase.GetCurrentMethod().ReflectedType.Name;

        public void Fun()
        {
            string methodName = MethodBase.GetCurrentMethod().Name;
            Console.WriteLine($"{className}----{methodName}-----{name}\n");
            Console.WriteLine($"{className}----{methodName}-----{age}\n");
        }
    }
}




SpecialClass.cs


using System.Reflection;

namespace ConsoleDeomAlien.MultiClass
{
    public partial class NormalClass
    {

        private const string name2 = "alien2";

        public void Fun2()
        {
            string methodName = MethodBase.GetCurrentMethod().Name;
            Console.WriteLine($"{className}----{methodName}-----{name2}\n");
        }
    }
}



SmallClass.cs


using System.Reflection;

namespace ConsoleDeomAlien.MultiClass
{
    public partial class NormalClass
    {
        private const string name5 = "alien5";
        public int age = 18;

        public void Fun5()
        {
            string methodName = MethodBase.GetCurrentMethod().Name;
            Console.WriteLine($"{className}----{methodName}-----{name5}\n");
        }
    }
}



MainClass.cs


using ConsoleDeomAlien.MultiClass;

namespace ConsoleDeomAlien
{
    public class MainMethod
    {
        public static void Main()
        {
            var cc = new NormalClass();
            cc.Fun();
            cc.Fun2();
            cc.Fun3();
            cc.Fun5();
            cc.age = 22;

            Console.WriteLine($"Main ---------{cc.age}");
            Console.ReadKey();
        }
    }
}



3.讲解部分

  • 每个partial 文件可以共享内容、共同组成一个类的前提是,命名空间、类名都一摸一样,如下所示。

namespace ConsoleDeomAlien.MultiClass
{
    public partial class NormalClass
    {
    }
}

  • 只要上面条件符合、发现文件在不同路径下,都可以实现共享机制。

  • 既然这个特殊的大类NormalClass需要多个文件共同维护,那每个文件肯定包含一些独有的方法。但是,只要初始化一次这个类,每个文件中独有的方法都可以被调用到
    C#---第二十: partial修饰类的特性及应用_第2张图片

  • 在SmallClass.cs 文件中定义了age 这个变量,但在NormalClass.cs文件中,也同样调用到了这个变量age。且在main方法中修改这个变量之后,这个值也变化了。

  • 每个类中定义的私有变量(private const string name)可供该类中的方法单独使用,方便与其他文件中的变量隔离。这样调用不同的方法,可以获取不同的值了。
    C#---第二十: partial修饰类的特性及应用_第3张图片

  • 在NormalClass.cs中定义的变量(string className),可以获取到调用该方法对应的class 名称.且该变量可共其他的partial 文件访问到。


string className = MethodBase.GetCurrentMethod().ReflectedType.Name;

  • 在每个方法中定义的局部变量(methodName),可以获取到该方法的名称,且这种方法名的获取方式,只能在方法中获取,在方法外不能获取到。

string methodName = MethodBase.GetCurrentMethod().Name;



4.最终输出内容

C#---第二十: partial修饰类的特性及应用_第4张图片

你可能感兴趣的:(C#基础,c#,开发语言,partial,局部类,应用)