分部类型
可以在多个源文件中为一个类型编写代码。特别适合用于部分代码是自动生成,而其他部分的代码为手动类型。
多个源代码文件组成的类型为分部类型
#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();
}
}
}
友元程序集让事情变得非常容易:使测试那些只能进行内部访问的代码工作,变成简单,而不用经历由于测试的目的而使成员变为公有这样不确定的步骤。

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

  1. ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作。那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别是fork、source和exec。 1. fork 即通过sh 脚本名进行执行脚本的方式。下面通过一个简单的例子来讲解下它的特性。 创建father.sh,内容如下: #!/bin/bas

    ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作.那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别 ...

  2. C#复习笔记(3)--C#2:解决C#1的问题(结束C#2的内容:最后一些特性)

    结束C#2的内容:最后一些新性 这是本章要讲的内容: 分部类型:可以在多个源文件中为 一个类型编写代码. 特别适用于部分代码是自动生成, 而其他部分的代码为手写的类型. 静态类:对工具类进行整理, 以 ...

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

    一.final关键字 1.final关键字修饰变量,表示变量不可以被改变,如果想修改,编译器不会接受的. 注意:final关键字定义的变量必须赋值 public  static final 修饰  白 ...

  4. 淘系工程师讲解的使用Spring特性优雅书写业务代码

    使用Spring特性优雅书写业务代码   大家在日常业务开发工作中相信多多少少遇到过下面这样的几个场景: 当某一个特定事件或动作发生以后,需要执行很多联动动作,如果串行去执行的话太耗时,如果引入消息中 ...

  5. Javascript 俄罗斯方块 游戏代码解释!

    俄罗斯方块代码说明 /** 名称:Javascript 俄罗斯方块! 作者:Gloot 邮箱:glootz@gmail.com QQ:345268267 网站:http://www.cnblogs.c ...

  6. 深入理解c#(第三版)(文摘)

    第一部分 基础知识 第1章 C#开发的进化史 1.3 1.3.1 表示未知的价格 public decimal? Price { get; private set; } new ProductWith ...

  7. 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】

    原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...

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

    前言 接下来我们将SQL Server基础系列还剩下最后几节内容结束,后续再来讲解SQL Server性能调优,我们开始进入主题. SQL Server事务对本地变量影响 事务对变量影响具体是指什么意 ...

  9. Vue深度学习(5)-过渡效果

    简介 通过 Vue.js 的过渡系统,你可以轻松的为 DOM 节点被插入/移除的过程添加过渡动画效果.Vue 将会在适当的时机添加/移除 CSS 类名来触发 CSS3 过渡/动画效果,你也可以提供相应 ...

随机推荐

  1. 用JavaScript和jQuery实现瀑布流

    ▓▓▓▓▓▓ 大致介绍 在慕课网上学习了用原生js和jQuery实现瀑布流,在这里做个笔记 ▓▓▓▓▓▓ 用JavaScript实现 基本结构: <div id="main" ...

  2. Swift3.0 函数闭包与OC Block

    刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> S ...

  3. Java中的常量治理

    版权声明:本文为博主原创文章,转载请注明出处,欢迎使劲喷 虽然推崇在java中使用枚举(可查看<Java中的枚举的治理>)来对数据字典及常量进行控制,但是有些时候,我们还是会觉得常量控制更 ...

  4. border-radius IE8兼容处理

    根据canisue(http://caniuse.com/#search=border-radius),border-radius兼容性如下图所示: 测试代码: <!DOCTYPE html&g ...

  5. 2015.07.20MapReducer源码解析(笔记)

    MapReducer源码解析(笔记)   第一步,读取数据源,将每一行内容解析成一个个键值对,每个键值对供map函数定义一次,数据源由FileInputFormat:指定的,程序就能从地址读取记录,读 ...

  6. MySQL二进制日志总结

    二进制日志简单介绍 MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句.二进制日志(binary log)中记录了对MySQL数据 ...

  7. C++ Primer 5 CH6 函数

    6.1 函数基础 函数包括:返回类型.函数名字.形参.函数体. 通过 "调用运算符"(一对圆括号)来执行函数,它作用于一个表达式,该表达式是函数或者指向函数的指针. 函数调用完成两 ...

  8. java学习常遇问题及解决方案

    eclipse中的项目运行时不出现run as→java application选项? 解决方案☞必须有正确的主方法,即public static void main(String[]args){}

  9. XJOI1680阿猫的实验

    阿猫的实验 阿猫很喜欢生物学.他还在今年的全国中学生生物学联赛中获得了一等奖.一天,阿猫在实验室听说了这样一种繁殖能力很强的老鼠.这种老鼠在出生后的第一个月,可以生出a 对老鼠:第二个月,可以生出b ...

  10. 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本

    老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...