《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,.托管代码和非托管代码的区别 ...
随机推荐
- Unity手游之路<七>角色控制器
Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...
- trigger() & bind() 使用心得
trigger(type) 在每一个匹配的元素上触发某类事件. 返回值:jQuery 参数: type (String): 要触发的事件类型 示例: $("p").trigger( ...
- 【函数】plsql 函数的默认值
1.创建函数 CREATE OR REPLACE FUNCTION fk_url_format(url VARCHAR2,charset VARCHAR2 :='UTF-8')RETURN VARCH ...
- CentOS用yum安装、配置MariaDB
.创建/etc/yum.repos.d/MariaDB.repo文件,这里用到了刚刚发布正式版的10. [mariadb] name = MariaDB baseurl = http://yum.ma ...
- FREE 开源 API 管理工具等
最近学习API 管理工具,发现几个不错的东西,记录如下: 1.IBM 收购NODE 厂家 STRONGLOOP 有一产品LOOPBACK,开源,好! 2.apigee api管理平台 也不错. 3 ...
- 【转】mysql的cardinality异常,导致索引不可用
转自:http://ourmysql.com/archives/1343 前段时间,一大早上,就收到报警,警告php-fpm进程的数量超过阈值.最终发现是一条sql没用到索引,导致执行数据库查询慢了, ...
- SQL Server 无法在服务器上访问指定的路径或文件解决方法
SQL Server 无法在服务器上访问指定的路径或文件解决方法 在SQL Server附加数据库或备份数据库时出现:无法在服务器上访问指定的路径或文件. 请确保您具有必需的安全权限且该路径或文件存在 ...
- SQL Server的“错误:9004”
客户的一台现场采集电脑崩溃,无法启动.用PE引导后,将MDF和LDF数据复制出来,往正常的数据库附加时,报如下错误: 处理数据库 'databasename' 的日志时出错.如果可能,请从备份还原.如 ...
- Kinect SDK 安装失败
错误提示:Kinect Management failed to start. 原因: 1, Kinect Management 服务相依的 Plug and Play的服务没有启动. 2,系统安装了 ...
- [第三方]SCNetworkReachability 获取网络状态控件使用方法
用Cocoa Pods导入控件以后 直接导头文件 复制以下代码 [SCNetworkReachability host:@"github.com" reachabilityStat ...