《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,.托管代码和非托管代码的区别 ...
随机推荐
- python 集合 -----直接用逗号连接的是元组,不是list
t = 12345, 54321, 'hello!' >>> t[0] 12345 >>> t (12345, 54321, 'hello!') 元组:元组由逗号分 ...
- Xcode 8 打印输出: Class PLBuildVersion is implemented in both...
在xcode8中,屏蔽了一些奇怪的输出之后,又发现了一个.具体啥原因还不是太清楚.但是可以解决这个问题,让其停止打印这个信息. 在 info.plist 中,添加两个键值对: 针对photo: key ...
- 解决Python往MySQL插入中文时报错的问题
今天遇到一个问题,用Python往MySQL插入数据时,若数据中包含中文会报类似下面的错误: ERROR 1366: Incorrect string value: '\xE4\xB8\xAD\xE5 ...
- 【GoLang】与或非 异或操作
在Go规范,^这个运算符在一元运算符和二元运算符中都出现了.那么他们分别是啥?在规范中说道:^ bitwise XOR integers这是按位异或. Go语言位操作实例 <!-- lang: ...
- [转]Tomcat----Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
对于使用IDE开发的程序员来讲,并不是所有人都对自己用来吃饭的工具了如指掌.常在阴沟跑,哪能不翻船.为此我把自己使用Tomcat/Eclipse的一些经验教训整理了一下,会陆续的贴出来,也许会帮到和我 ...
- 【leetcode】Substring with Concatenation of All Words
Substring with Concatenation of All Words You are given a string, S, and a list of words, L, that ar ...
- 【Unity3D】使用鼠标键盘控制Camera视角(即时战略类游戏视角):缩近,拉远,旋转
今天写一个demo,要用到鼠标键盘控制三维视角,因此写了个脚本用于控制. 该脚本可以用于即时战略类游戏的视角,提供了缩进,拉伸,旋转.同时按住鼠标右键不放,移动鼠标可以实现第一人称视角的效果. usi ...
- 【leetcode】Regular Expression Matching
Regular Expression Matching Implement regular expression matching with support for '.' and '*'. '.' ...
- DNS基础及域名系统架构
本文出自 http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...
- PHP json_encode / json_decode
2015年3月26日 14:14:16 PHP的json函数对几个特殊值的处理笔记 <?php //----------编码 $a = array(); $b = json_encode($a) ...