• 结束C#2的讲解:最后的一些特性


    分部类型
    可以在多个源文件中为一个类型编写代码。特别适合用于部分代码是自动生成,而其他部分的代码为手动类型。
    多个源代码文件组成的类型为分部类型
    #region 7-1演示分部类型的混合声明
    partial class Example<TFirst, TSecond> : IEquatable<string> where TFirst : class//接口和类型的参数约束,如果实现基类,则必须为EventArgs
    {
    public bool Equals(string other)//实现IEquatable<string>
    {
    return false;
    }
    }
     
    partial class Example<TFirst, TSecond> : EventArgs, IDisposable//指定基类和接口,不能进行参数约束
    {
     
    public void Dispose()//实现IDisposable
    {
    }
    }
    #endregion
    分部类型还有一种不同用法:辅助进行重构,一个类型变得太大,担当太多职责,就对其进行重构。第一步,把臃肿的类型分为较小的类,接着在文件之间移动方法直到每个文件只处理一种特定的内容。
    还有一个用途:单元测试。使用分部类型将测试划分为多个易于理解的小块。
    C#中独有的分部方法
    #region 7-2分部方法在构造函数中被调用
    partial class PartialMethodDemo
    {
    public PartialMethodDemo()
    {
    OnConstructorStart();
    Console.WriteLine("Generated constructor");
    OnConstructorEnd();
    }
    partial void OnConstructorStart();//方法没有实现,将被移除,IL中不存在
    partial void OnConstructorEnd();//分部方法和抽象方法相同:只使用partial修饰符提供签名无需实现
    }
     
    partial class PartialMethodDemo
    {
    partial void OnConstructorEnd()//实际实现需要partial,返回类型必须是void,不能获取out参数,它们是私有的
    {
    Console.WriteLine("Manual code");
    }
    }
    #endregion
    静态类型
    对工具类进行整理,以便编译器能明白你是否在不恰当的使用它们,并使你的意图更明显。
    工具类的主要特征
    • 所有成员都是静态的(除了使用构造函数)
    • 类直接从object派生
    • 一般情况下不应该有状态,除非涉及高速缓存或单例
    • 不能存在任何构造函数
    • 类可以是密封的
    C#1的工具类
    #region 7-3典型的C#1工具类
    public sealed class NonStaticStringHelper//密封类防止派生
    {
    private NonStaticStringHelper()//提供一个私有的构造函数,防止其他代码对其进行实例化
    { }
     
    public static string Reverse(string input)//所有方法都是静态的
    {
    char[] chars = input.ToCharArray();
    Array.Reverse(chars);
    return new string(chars);
    }
    }
    #endregion
    将工具类转换为C#2静态类
    #region 7-4将代码7-3中的工具类转化为一个C#2的静态类
    public static class StringHelper
    {
    public static string Reverse(string input)
    {
    char[] chars = input.ToCharArray();
    Array.Reverse(chars);
    return new string(chars);
    }
    }
    #endregion
    C#2中编译器在静态类定义上执行了大量约束:
    • 类不能声明为abstract或sealed
    • 类不能设定任何要实现的接口
    • 类不能设定基类
    • 类不能包含任何非静态成员,包括构造函数
    • 类不能包含任何操作符
    • 类不能包含任何protected或protected internal成员
    独立的取值方法/赋值方法属性访问器
    公有取值方法和私用赋值方法
    命名空间别名
    在类型名称不唯一情况下的一种决解方法。
    命名空间的主要意图是将众多类型组织成一个有用的层级
    using指令能够用于两种情况
    一种是为命名空间和类型创建一个别名(例如:using out=System.Console;)
    另一种就是将一个命名空间引入到编译器查找的某个类型(例如:using System。IO;)时可以搜索的上下文列表中。
    using WinForms = System.Windows.Forms;
     
    namespace 第七章结束Csheep2的讲解最后一些特性窗体
    {
    class WinForms { };//名字同为WinForms
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    Type s2 = typeof(WinForms::Button);//使用::告知编译器WinForms仍然做别名使用
    }
    }
    }
    全局命名空间别名
    class Configuration { }
    namespace 第七章结束Csheep2的讲解最后一些特性
    {
     
    class Program
    {
    class Configuration { }
    static void Main(string[] args)
    {
    #region 7-7使用全局命名空间别名来准确的设定想要的类型
    Console.WriteLine(typeof(Configuration));//打印:第七章结束Csheep2的讲解最后一些特性.Program+Configuration 移动命名空间之前就把Configuration解析为这个类型
    Console.WriteLine(typeof(global::Configuration));//打印:Configuration
    Console.WriteLine(typeof(global::第七章结束Csheep2的讲解最后一些特性.Program));
    #endregion
    Console.ReadKey();
    }
    }
    外部别名
    你可以使用extern外部别名来指定额外信息
    pragma指令
    用于操作特定编译指令。
    C#编译器理解的两种pragma指令:警告和校验和
    #region 7-9包含了未用字段的类
    public class FieldUsedOnlyByflection
    {
    #region 7-10禁用和恢复警告
    #pragma warning disable 0169 //禁用警告
    int x;
    #pragma warning restore 0169//恢复警告
    #endregion
    }
    #endregion
    非安全代码中固定大小的缓存区
    在非安全代码中,可以更多的控制结构处理数组的方式
    把内部成员暴露给选定的程序集
    在.NET1中,内部的类型,方法,属性,变量和事件,都只能在其声明的同一个程序集中被访问不过在.NET2中InternalsVisibleTo稍稍打破了这个规则。我们把包含这个属性的程序集称为源程序集,应用这个属性的时候,必须设定另外一个程序集,既通常所说的友元程序集。友元程序集可以看到源程序集中所有成员
    [assembly: InternalsVisibleTo("FriendAssembly")]//只能用于程序集,授予FriendAssembly额外的访问权限
    namespace Source
    {
    #region 7-12友元程序集的演示
     
    public class Source1
    {
    internal static void InternalMethod()//在FriendAssembly可被访问
    {
    Console.WriteLine("InternalMethod()");
    }
     
    public static void PublicMethod()
    {
    Console.WriteLine("PublicMethod()");
    }
    }
    #endregion
    }
    namespace FriendAssembly
    {
    public class Class1
    {
    public void test()
    {
    Source1.PublicMethod();
    Source1.InternalMethod();
    }
    }
    }
    友元程序集让事情变得非常容易:使测试那些只能进行内部访问的代码工作,变成简单,而不用经历由于测试的目的而使成员变为公有这样不确定的步骤。
  • 相关阅读:
    SiteMesh在项目中的配置
    javascript深入理解js闭包
    小tip: 使用CSS将图片转换成黑白(灰色、置灰)
    java程序员最不愿意看到的十件事
    Spring AOP AspectJ
    2万字Java并发编程面试题整理(含答案,建议收藏)
    85道Java微服务面试题整理(助力2020面试)
    10个很多人不知道的Redis使用技巧
    2020年大厂Java面试题(基础+框架+系统架构+分布式+实战)
    2020年薪30W的Java程序员都要求熟悉JVM与性能调优!
  • 原文地址:https://www.cnblogs.com/Tan-sir/p/5169212.html
Copyright © 2020-2023  润新知