• C#中的partial,this关键字以及扩展方法


    NO one
    partial:C#允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。
    局部类型适用于以下情况:
    (1) 类型特别大,不宜放在一个文件中实现。
    (2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。
    (3) 需要多人合作编写一个类。
    局部类型的限制:
    (1) 局部类型只适用于类、接口、结构,不支持委托和枚举。
    (2) 同一个类型的各个部分必须都有修饰符 partial。
    (3) 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。
    (4) 一个类型的各个部分必须被同时编译。
    代码示例:
    // partial1.cs:
    namespace CodeSamples
    {
    public partial class MyPartialClass
    {
    public int method1(int x)
    {
    Console.WriteLine(x);
    return 0;
    }
    }
    }
    // partial2.cs
    namespace CodeSamples
    {
    public partial class MyPartialClass
    {
    public void method2(double x)
    {
    Console.WriteLine(x);
    }
    }
    }
    // program.cs
    static void Main(string[] args)
    {
    MyPartialClass obj = new MyPartialClass();
    obj.method1(11);
    obj.method2(34.23);
    Console.Read();
    }

    NO Two
    C#扩展方法
    扩展方法的的一些概念:
    扩展方法是你能够向现有类型添加方法,而无需创建新的派生类型、重新编译或以其它方式修改原始类型;扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用,对于C#而言,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异;扩展方法虽然被定义为静态方法,但它们是通过实例方法语法进行调用的,它们的第一个参数指定该方法作用于哪个类型,并且该参数以this修饰符为前缀,仅当你使用using指令将命名空间显式导入到源代码之后,扩展方法才位于范围中;

    代码示例1:
    namespace ExtensionMethods
    {
    public static class MyExtensions
    {
    public static int WordCount(this String str)
    {
    return str.Split(new char[] { ' ', '.', '?' },
    StringSplitOptions.RemoveEmptyEntries).Length;
    }
    }
    }
    可使用using指令将WordCount扩展方法至于范围内:
    using ExtensionMethods;
    而且可以使用以下语法从应用程序中调用该扩展方法:
    string s = "Hello Extension Methods";
    int i = s.WordCount();

    解答心中的疑惑点:在代码中,可以使用实例方法语法调用该扩展方法,但是编译器生成的中间语言会将转换为对静态方法的调用。因此,并未真正违反封装原则。扩展方法只能是访问所扩展类的public成员

    为了方便理解:在看一个例子-->扩展方法的目的就是为一个现有类型添加一个方法,现有类型既可以是int,string等数据类型,也可以是自定义的数据类型。为数据类型的添加一个方法的理解:一般来说,int数据类型有个Tostring的方法,就是把int 数据转换为字符串的类型,比如现在我们想在转换成字符串的时候还添加一点东西,比如增加一个字符 a .那么之前的Tostring就不好使了,因为它只是它我们的int数据转换为string类型的,却并不能添加一个字母 a.所以这就要用到所谓的扩展方法了。

    在编译时绑定扩展方法:
    可以使用扩展方法来扩展类或接口,但不能重写扩展方法,与接口或类方法具有相同名称和签名的扩展方法永远不会被调用;编译时,扩展方法的优先级总是比类型本身中定义的实例方法低。换句话说,如果某个类型具有一个名为 Process(int i) 的方法,而你有一个具有相同签名的扩展方法,则编译器总是绑定到该实例方法。当编译器遇到方法调用时,它首先在该类型的实例方法中寻找匹配的方法。如果未找到任何匹配方法,编译器将搜索为该类型定义的任何扩展方法,并且绑定到它找到的第一个扩展方法。

    扩展方法:

    1.方法所在的类必须是静态的
    2.方法也必须是静态的
    3.方法的第一个参数必须是你要扩展的那个类型,比如你要给int扩展一个方法,那么第一个参数就必须是int。
    4.在第一个参数前面还需要有一个this关键字
    参考:https://blog.csdn.net/zyh_1988/article/details/51103612
    https://www.cnblogs.com/rinack/p/5695067.html

    No Three

    C#中的this关键字
    1.this代表当前类的实例对象
    2.用this串联构造函数
    namespace Demo
    {
    public class Test
    {
    public Test()
    {
    Console.WriteLine("无参构造函数");
    }
    // this()对应无参构造方法Test()
         // 先执行Test(),后执行Test(string text)
    public Test(string text) : this()
    {
    Console.WriteLine(text);
    Console.WriteLine("有参构造函数");
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    try
    {
    Test test = new Test("张三");
    }
    catch (Exception ex)
    {
    Console.WriteLine(ex);
    }
    finally
    {
    Console.ReadLine();
    }
    }
    }
    }
    3.应用于某一类型(原始类型或自定义)的扩展方法
    4.通过this实现索引器,可用于优化程序性能

  • 相关阅读:
    一、 IO 五种模型
    Spring核心IoC和AOP的理解
    spring读取properties文件配置使用
    Linux下的SVN服务器搭建
    Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
    时间戳函数
    用户,角色,权限对象
    程序翻译文本传输请求创建
    ALV值存放图标
    函数的异步、延迟调用
  • 原文地址:https://www.cnblogs.com/wecc/p/11283939.html
Copyright © 2020-2023  润新知