《CLR via C#》读书笔记(6)类型和成员基础
- 常量 常量是在编译时设置其值并且永远不能更改其值的字段。使用常量可以为特殊值提供有意义的名称以代替数字文本,以使代码变得更容易阅读及维护。定义常量请使用关键字const。private const Int32 SomeConstant = 1;
- 字段 字段存储着类满足其设计所必须拥有的数据。例如,表示日历日期的类可能有三个整数字段:一个表示月份,一个表示日期,还有一个表示年份。强烈建议将字段声明为私有字段,防止类型的状态被该类型外部的代码破坏,外部访问字段应通过属性或方法来进行。private readonly Int32 SomeReadInlyField = 2; //只读字段
- 实例构造器 用于创建和初始化实例。创建新对象时将调用类构造函数。static SomeType() { }
- 类型构造器 类型构造器是 static方法,不能带任何参数。public SomeType(Int32 x) { }
- 方法 是通过指定访问级别、返回值、方法名称和任何方法参数在类或结构中声明的。这些部分统称为方法的“签名”。 方法参数括在括号中,并用逗号隔开。空括号表示方法不需要参数。作用于类型时,称为静态方法;作用于实例时,称为实例方法。方法一般会对类型或对象的字段执行读写操作。
- 操作符重载 它实际上是一个方法,定义了将一个特定的操作符作用于对象时,应当如何操作。
- 转换操作符 定义如何隐式或者显式地将对象从一种类型转换为另一种类型的方法。
- 属性 利用属性,可以使用一种简单的、字段风格的语法来设置或查询类型或对象的部分逻辑状态。它可以是没有参数的,也可以是有参数的。pulict Int32 this[String s]{ get;set;}
- 事件 利用事件,可以向一个或多个静态或实例方法发送通知。事件包含两个方法,用于登记或者注销对该事件的关注(+=/-=)。事件通常使用一个委托类型来维护可登记的方法。public event EventHandler SomeEvent;
- 类型 类型可定义嵌套于其中的其他类型(内部类,嵌套类)。通常用这种方式将一个大且复杂的类型分解成较小的类型,以简化开发。
CLR术语 | C#术语 | 描述 |
---|---|---|
private | private | 只限于包含类型 |
Family | protected | 受保护的,子类能继承,其他类不能直接访问 |
Family and Assembly | (不支持) | 成员只能由定义类型、任何嵌套类型或者同一个程序集中定义的任何派生类型中的方法访问 |
Assembly | internal | 只限于当前程序集 |
Family or Assembly |
protected internal |
同一个程序集内部的子类可以继承,其他类不能访问 |
public | public | 不受限制 |
在C#中,如果没有显示声明成员的可访问性,编译器通常(但不是总是)默认选择 private。
CLR要求接口类型的所有成员都具有 public 可访问性。禁止开发人员显示指定。
- 组件(.NET中称为程序集或)有“已经发布”的意思。
- 组件有自己的标识(名称、版本、语言文化和公钥)。
- 组件永远维持自己的标识。
- 组件清楚指明它所依赖的组件(引用元数据表)。
- 组件要文档花它的类和成员。C#语言通过源代码内的 XML 文档和编译器的 /doc 机制提供这个功能。
- 组件要发布一个在任何“维护版本”中都不会改变的接口(对象模型)。“维护版本”代表组件的新版本,向后兼容。
C#关键字 | 类型 | 方法/属性/事件 | 常量/字段 |
---|---|---|---|
abstract | 表示不能构造该类型的实例 | 表示为了构造派生类型的实例,派生类型必须重写并实现这个成员 | (不允许) |
virtual | (不允许) | 表示这个成员可由派生类型重写 | (不允许) |
override | (不允许) | 表示派生类型重写了基类型的成员 | (不允许) |
sealed | 表示该类型不能用作基类型 | 表示这个成员不能被派生类型重写,只能将该关键字应用于准备重写一个虚方法 | (不允许) |
new |
应用于嵌套类型、方法、属性、事件、常量或字段时,表示该成员与基类中相似的成员无任何关系。 |
6.6.1CLR如何调用虚方法、属性和事件
在类型上执行的操作,称为静态方法,在类型的实例上执行操作,称为非静态方法。
static void Main(string[] args)
{
Console.WriteLine(); //调用一个静态方法 public static void WriteLine();
Object o = new Object();
o.GetHashCode(); //调用一个虚实例方法 public virtual int GetHashCode();
o.GetType(); //调用一个非虚实例方法 public Type GetType();
}
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] object obj2)
L_0000: nop
L_0001: call void [mscorlib]System.Console::WriteLine() //call指令调用了Console的writeLine方法
L_0006: nop
L_0007: newobj instance void [mscorlib]System.Object::.ctor()
L_000c: stloc.0
L_000d: ldloc.0
L_000e: callvirt instance int32 [mscorlib]System.Object::GetHashCode() //使用callvirt调用GetHashCode
L_0013: pop
L_0014: ldloc.0
L_0015: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType() //callvirt调用GetType
L_001a: pop
L_001b: ret
}
public sealed class Program
{
public Int32 GetFive() { return 5; }
static void Main(string[] args)
{
Program p = null;
Int32 x = p.GetFive(); //“System.NullReferenceException”类型的未经处理的异常
}
}
internal class SomeClass
{
public override string ToString()
{
//编译器会使用IL指令“call”
//以非虚方式调用 object的 Tostring方法
//如果使用'callvirt'而不是'call'
//那么该方法将递归地调用其本身,直至栈溢出
return base.ToString();
}
}
设计一个类型时,尽量减少定义的虚方法数量
- 首先是速度慢,
- 其次 JIT 编译器不能内嵌虚方法。
- 虚方法使组件的版本控制变得更脆弱。
- 定义一个基类型,经常用到重载的简便方法,如果希望这些方法是多态,最好的办法是使最复杂的方法成为虚方法,简便的方法为非虚方法
public class Set
{
private Int32 m_length = 0;
public Int32 Find(Object value)
{
return Find(value, 0, m_length);
}
public Int32 Find(Object value, Int32 startIndex)
{
return Find(value, startIndex, m_length - startIndex);
}
public virtual Int32 Find(Object value, Int32 startIndex, Int32 endIndex)
{
//可被重写的实现放这里
}
//其他方法放这里
}
《CLR via C#》读书笔记(6)类型和成员基础的更多相关文章
- [Clr via C#读书笔记]Cp6类型和成员基础
Cp6类型和成员基础 成员 常量:字段(静态字段和实例字段):实例构造器:类型构造器(用于静态字段的构造):方法(静态方法和实例方法):操作符重载(本质是一个方法):转换操作符:属性(本质还是方法): ...
- [Clr via C#读书笔记]Cp4类型基础
Cp4类型基础 Object类型 Object是所有类型的基类,有Equals,GetHashCode,ToString,GetType四个公共方法,其中GetHashCode,ToString可以o ...
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
- [CLR via C#]6. 类型和成员基础
原文:[CLR via C#]6. 类型和成员基础 6.1 类型的各种成员 在一个类型中,可以定义0个或多个以下种类的成员: 1)常量 常量就是指出数据值恒定不变的符号.这些符号通常用于使代码更 ...
- 《Programming Hive》读书笔记(两)Hive基础知识
<Programming Hive>读书笔记(两)Hive基础知识 :第一遍读是浏览.建立知识索引,由于有些知识不一定能用到,知道就好.感兴趣的部分能够多研究. 以后用的时候再具体看.并结 ...
- Clr Via C#读书笔记---程序集的加载和反射
#1 加载程序集 Assembly.Load: public class Assembly { public static Assembly Load(AssemblyName assemblyRef ...
- CLR via C#读书笔记一:CLR的执行模型
CLR(Common Language Runtime)公共语言进行时是一个可由多种编程语言使用的“进行时”. 将源代码编译成托管模块 可用支持CLR的任何语言创建源代码文件,然后用对应的编译器检查语 ...
- <NET CLR via c# 第4版>笔记 第6章 类型和成员基础
6.1 类型的各种成员 6.2 类型的可见性 public 全部可见 internal 程序集内可见(如忽略,默认为internal) 可通过设定友元程序集,允许其它程序集访问该程序集中的所有inte ...
- CLR via C# 读书笔记-21.托管堆和垃圾回收
前言 近段时间工作需要用到了这块知识,遂加急补了一下基础,CLR中这一章节反复看了好多遍,得知一二,便记录下来,给自己做一个学习记录,也希望不对地方能够得到补充指点. 1,.托管代码和非托管代码的区别 ...
随机推荐
- css代码优化
一.CSS代码优化作用与意义 1.减少占用网页字节.在同等条件下缩短浏览器下载css代码时间,相当于加快网页打开速度2.便于维护.简化和标准化css代码让css代码减少,便于日后维护3.让自己写的cs ...
- [BZOJ4016][FJOI2014]最短路径树问题
[BZOJ4016][FJOI2014]最短路径树问题 试题描述 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长 ...
- ubuntu14.04显卡驱动问题(amd5600k集显7650d)
安装ubuntu的时候,多次莫名其妙地黑屏,起初以为是最新得ubuntu14.04安装包不稳定,所以一直尝试了很多次. 重启-->安装-->黑屏(硬盘仍在转动,屏幕上什么都没有)--> ...
- cacti错误
cacti 错误:CMDPHP: Poller[0] ERROR 解决方案: 找到错误表 desc 表名: 修复此表 mysqlcheck -A -o -r -p -u用户名
- 2016全国研究生数学建模A题多无人机协同任务规划——基于分布式协同多旅行商MTSP遗传算法
MTSP问题是指:有Ⅳ个城市,要求旅行商到达每个城市各一次,且仅一次,并[旦 1到起点,且要求旅行路线最短.而多旅行商问题M个旅行商从同一个城市(或多个城市)出发.分羽走一条旅路线,且总路程缀短.有关 ...
- 【Java POI】POI基于事件驱动解析大数据量2007版本Excel,空值导致列错位问题
1.目前测试了20M的文件,可以读取. 2.支持单个工作表1万+的数据行数,耗时如图. 3.以下是关键地方处理的代码 //Accepts objects needed while parsing. / ...
- Objective C 内存管理[转]
1 配对原则 alloc – release new – release retain - release copy – release 2 new和alloc-init的区别 (1)区别只在于a ...
- ASIO插件 真的能提升 音质?(听音乐者必看)
最近在倒弄HIFI音乐播放器footbar2000的配置时,发现了2011年的一个神贴, 最牛逼的是,这个神贴到现在还屹立不倒,还有很多无知的人在下面膜拜, 我真的想问:你这么优秀,都能逆天反转音质, ...
- Asp.net MVC网站的基本结构
Asp.net MVC网站的基本结构:Controller->IBLL(定义业务接口)->BLL->DA(调用Utility)->数据库 ,其中A->B表示A调用B 1. ...
- rpm包制作(待实验)
作者:firefoxbug 时间:July 18, 2014 rpm包命名规范 对于rpm包的命名符合如下规范. %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm N ...