结束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();

}

}

}

友元程序集让事情变得非常容易:使测试那些只能进行内部访问的代码工作,变成简单,而不用经历由于测试的目的而使成员变为公有这样不确定的步骤。

时间: 2024-07-28 13:55:15

结束C#2的讲解:最后的一些特性的相关文章

Windows-007-命令行(CMD)查看、结束进程命令实例讲解

本节主要讲述 Windows 系统下,如何利用命令行(CMD)查看进程信息,如何结束进程.敬请亲们参阅,希望能对亲们有所帮助,如有不足之处,敬请大神指正,不胜感激! 需要用到的命令: netstat tasklist tskill 首先,启动命令行工具 先下班了,回去在写....^_^

java基础讲解10-----类的高级特性

一.final关键字 1.final关键字修饰变量,表示变量不可以被改变,如果想修改,编译器不会接受的. 注意:final关键字定义的变量必须赋值 public  static final 修饰  白送和i全局常量    定义时,必须赋值.(常用) 2.final修饰方法    这个方法不能被重写 3.final修饰类    这个类不能被继承

全面系统讲解CSS 工作应用+面试一步搞定

第1章 课程介绍 对课程整体进行介绍 第2章 HTML基础强化 讲解HTML常见元素.版本(HTML4/XHTML/HTML5的关系)以及HTML元素的分类和嵌套关系.关注元素默认样式和定制化. 第3章 CSS基础 全面讲解CSS基础知识,包括层叠样式表的基本规则和含义.选择器(分类.特性.权重.性能).非布局样式属性.CSS hack以及一些案例分析(checkbox等). 第4章 CSS布局 讲解布局样式属性(display/position/z-index/flex/float)以及它们之

[gitbook] Android框架分析系列之Android Binder详解

请支持作者原创: https://mr-cao.gitbooks.io/android/content/android-binder.html Android Binder详解 Table of Contents 1. binder简介 2. binder的实现 2.1. IBinder类简介 2.2. IInterface类简介 2.3. BpBinder和BBinder简介 2.4. ProcessState和IPCThreadState简介 2.5. ServiceManager简介 2.

深入分析DDR(转载)

文/IT168评测室特约 Myddn [IT168评测室]最近,假如你仔细的观察PC领域发生的变化,你就会注意的一个新鲜的术语“DDR2”频频出现.顾名思义,DDR2就是第二代双倍速率同步动态随机存储器,这个名字听上去很拗口,实际上我们只要知道它的缩写是DDR SDRAM就行了.就目前的发展看来,DDR2绝对不是纸上谈兵,它的平台已经准备好了,不出意外的话,Intel七月份就会发布支持DDR2的芯片组925X和915.明年,DDR2就会成为PC上普遍使用,甚至是主流的内存类型. 因此,我们应该了

Spring Boot干货系列:(一)优雅的入门篇

Spring Boot干货系列:(一)优雅的入门篇http://www.cnblogs.com/zheting/p/6707032.html  全篇参考:http://www.cnblogs.com/zheting/category/966890.html 前言 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社区中热度一直很高,所以决定花时间来了解和学习,为自己做技术储备.   正文 首先声明,Spring Boot不是一门新技术,所以不用紧张.从本质上来说,

SQL Server-聚焦事务对本地变量、临时表、表变量影响以及日志文件存满时如何收缩(三十一)

前言 接下来我们将SQL Server基础系列还剩下最后几节内容结束,后续再来讲解SQL Server性能调优,我们开始进入主题. SQL Server事务对本地变量影响 事务对变量影响具体是指什么意思呢,换句话说就是当我们回滚事务和提交事务之后对本地变量是否起作用呢,下面我们来看下具体例子. PRINT '回滚事务之后测试' DECLARE @FlagINT INT SET @FlagInt = 1 PRINT @FlagInt ---- 此时变量值为1 BEGIN TRANSACTION S

数据库系列之T-SQL(事务)

什么是事务? 事务是一个不可分割的操作,要么全部执行,要么全部不执行 事务有什么用? 保证一个业务的完整执行. 怎么用事务? 3.1 事务的分类 显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用的事务类型. 隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务.当该事务完成时,再下一个 T-SQL 语句又将启动一个新事务. 自动提交事务:这是 SQL Server 的默认模式,它将每条

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&amp;混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而