1. 引用类型(class)与值类型(strust)的构造函数(实例构造器)

1,  创建一个引用类型的实例时,首先为实例的数据字段分配内存,然后初始对象的附加字段,最后调用实例构造器来设置对象的初始化状态。

2,  实例构造器用于不能被继承,如果没有定义任何构造器,编译器会指定一个默认的无参数构造器,在它的实现中只是简单的调用基类的无参构造器。(编译器不会为值类型生成默认的构造器,而且不能定义无参构造器)

3,  如果派生类没有显示的调用一个基类的构造器,编译器会自动生成对默认的基类构造器的调用,最终调用到Object的构造器。

4,  不要在构造器中调用会影响构造对象的任何虚方法,因为假如在派生类中进行了重写,会调用重写的实现,但在继承层次中,字段没有完全初始化(很好理解,B:A,A的构造函数中调用虚方法Show(),会调用B中重写的Show(),这个时候B没有初始化,容易出错)。

5,  在多构造器的时候不要造定义字段的时候就赋值,这样的话在每一个构造器编译的时候会生成多次初始化字段的代码。如果有几个初始化的实例字段和大量的重载构造器方法,可考虑在单个构造器中执行这些公共的初始化。(值类型不能为字段设置初始值,而且在定义的有参构造器中必须对字段全部赋值)例如下面这种写法

class CLRClassTest

{

private Int32 a = 2;

private string b = "1d";

private double c = 2.22;

public CLRClassTest()

{ }

public CLRClassTest(string a)

{ }

public CLRClassTest(double b)

{}

}

转换成下面这种写法

class CLRClassTest

{

private Int32 a;

private string b;

private double c;

public CLRClassTest()

{

a = 2;

b = "1d";

c = 2.22;

}

public CLRClassTest(string a)

: this()

{ }

public CLRClassTest(double b)

: this()

{ }

}

1.类型构造器

  1. 类型构造器的作用是设置类型的初始化状态,类型构造器没有参数,写法如下

class SomeRefType

{

static SomeRefType()

{

//SomeRefType被首次访问时,会执行这里的代码

}

}

  1. 定义类型构造器类似于定义无参实例构造器,区别在于必须标记为static,而且默认为私有,不能设置访问修饰符。
  2. 类型构造器中的代码只能访问静态字段,并且常规用途就是初始化这些字段,编译器会自动生成一个类型构造器,如下

class SomeRefType

{

private static Int32 x = 5;

}

默认生成如下代码

class SomeRefType

{

private static Int32 x ;

static SomeRefType()

{

x = 5;

}

}

4. 操作符重载方法(operator)

操作符是指 +,-,*,/,%,>>,|,||等。

如何定义操作符重载请看下面方法。

class CLRComplex

{

public int a;

public static CLRComplex operator +(CLRComplex c1, CLRComplex c2)

{

return new CLRComplex{a=c1.a+c2.a};

}

}

调用操作符重载如下:

CLRComplex a = new CLRComplex() { a = 1 };

CLRComplex b = new CLRComplex() { a = 2 };

CLRComplex c = a + b;

5. 转换操作符(implicit,explicit)

1,  当源类型和目标类型都是基元类型时,编译器自己就知道如何生成转换对象所需要的代码

2,  Implicit关键字告诉编译器为了生成代码来调用方法,不需要再源代码中进行显示转换,explicit关键字告诉编译器只有在发现了显示转换时,才调用方法。

3,  在implicit和explicit关键字之后,要指定operator关键字告诉编译器该方法是一个转换操作符,在operator之后,指定对象要转换成什么类型,在圆括号内指定要从什么类型转,注意使用as或者is操作符时候,永远不会调用这些方法

具体使用方法见下面代码。

/// <summary>

/// 转换操作符

/// </summary>

class CRLRational

{

int a;

float b;

public CRLRational(int num)

{ a = num; }

public CRLRational(float num)

{ b = num; }

public int ToInt()

{

return a;

}

public float ToFloat()

{

return b;

}

public static implicit operator CRLRational(int num)

{

return new CRLRational(num);

}

public static explicit operator CRLRational(float num)

{

return new CRLRational(num);

}

public static implicit operator int(CRLRational r)

{

return r.ToInt();

}

public static explicit operator float(CRLRational r)

{

return r.ToFloat();

}

}

调用方法如下

CRLRational r1 = 5;

CRLRational r2 = (CRLRational)2.5f;

//CRLRational r3 = 2.5f as CRLRational;

//无法通过引用转换、装箱转换、取消装箱转换、包装转换或 null 类型转换将类型“float”转换为“CRLRational”

int a = r1;

float b = (float)r2;

6扩展方法(extension method)

扩展方法的规则和原则

1,  c#只支持扩展方法,不支持扩展属性,扩展事件,扩展操作等,

2,  扩展方法必须在非泛型的静态类中声明,类名没有限制,至少包含一个参数且第一个参数必须为this标记,且只有第一个参数被this标记

3,  扩展方法必须在顶级静态类中定义,不能再嵌套类中定义。

4,  编译器会检查文件作用域中所有的静态类,并扫描它们的所有静态方法来匹配,为了增强性能,避免找到非你所愿的一个扩展方法,编译器要求Using扩展方法的命名空间。

5,  不能给object类型写扩展方法,避免VS智能感知感知到太多垃圾信息。

6,  潜在风险,假如微软提供了一个你扩展方法相同的方法,会调用微软的方法

编译器查找扩展方法的路径,StringBuilder为例:它先检查StringBuilder的所有基类是否提供相应方法,如果存在就调用,如果没有,则继续检查是否有任何静态类定义的对应静态方法,它的第一个参数是和当前用于调用方法的那个表达式的类型匹配的一个类型,而且这个类型必须用this关键字表示,

下面是一个扩展方法的实例:

public static class CLR扩展方法

{

public static int IndexOf(this StringBuilder sb, Char value)

{

for (int i = 0; i < sb.Length; i++)

{

if (sb[i] == value)

return i;

}

return -1;

}

}

StringBuilder sb = new StringBuilder("ffsafsadyaerbgdgasg");

int i = sb.IndexOf('c');

7.分部方法(partial)

对这个不熟,不知道应用场景。以后再补这一块。

【Clr in c#】方法的更多相关文章

  1. 在SQL Server中使用CLR调用.NET方法

    介绍    我们一起来做个示例,在.NET中新建一个类,并在这个类里新建一个方法,然后在SQL Server中调用这个方法.按照微软所述,通过宿主 Microsoft .NET Framework 2 ...

  2. CLR via C#深解笔记四 - 方法、参数、属性

    实例构造器和类(引用类型) 构造器(constructor)是允许将类型的实例初始化为良好状态的一种特殊方法.构造器方法在“方法定义元数据表”中始终叫.ctor. 创建一个引用类型的实例时: #1, ...

  3. [CLR via C#]8. 方法

    一.实例构造器和类(引用类型) 类实例构造器是允许将类型的实例初始化为良好状态的一种特殊的方法. 类实例构造器方法在"方法定义元数据表"中始终叫.ctor(代表constructo ...

  4. 重温CLR(六)方法和参数

    实例构造器和类(引用类型) 构造器是将类型的实例初始化为良好状态的特殊方法.构造器方法在“方法定义元数据表”中始终叫做.ctor(constructor的简称).创建引用类型的实例时,首先为实例的数据 ...

  5. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_方法执行

    [前言] 方法执行前,CLR 会检测方法内代码引用的所有类型.同时 CLR 会分配一个内部数据结构,用来管理对所有引用的类型的访问. 首次执行方法时,托管程序集会把 IL 转换成本地 CPU 指令,并 ...

  6. C#夯实基础之接口(《CLR via C#》读书笔记)

    一. 接口的类型 接口是引用类型.因此从值类型赋值给接口是需要装箱的.如下所示: class Program { static void Main(string[] args) { ISay catS ...

  7. 《CLR via C#》读书笔记(6)类型和成员基础

    6.1 类型的各种成员 在一个类型中,可以定义0个或者多个以下种类的成员: 常量 常量是在编译时设置其值并且永远不能更改其值的字段.使用常量可以为特殊值提供有意义的名称以代替数字文本,以使代码变得更容 ...

  8. CLR执行模式之程序集代码的执行

    所知IL是与CPU无关的机器语言,其能访问和操作对象类型,并提供指令来创建和初始化对象,调用对象上的虚方法以及直接操作数组对象等,故可视为一种面向对象的机器语言.每种语言的存在都有其存在的价值和原因, ...

  9. 【CLR VIA C#】读书笔记

    工作几年了才看,记录下笔记备忘. 章节 笔记 1.CLR的执行模型 公共语言运行时(Common Language Runtime,CLR) 源代码-->编译器检查语法和分析源代码-->托 ...

  10. CLR via C# - CLR模型

    博客园对markdown支持不佳,错乱移步Github IO 博文 CLR 的执行模型 模块/程序集 1.模块 托管模块组成部分 PE32/PE32+头 : PE即Portable Executabl ...

随机推荐

  1. 关于Hibernate的关联映射

    何为关联映射 由于数据库的表与表之间存在的管理关系,可以分为一对一,一对多和多对多关联,一般情况下,在数据库设计中是通过表的外键来建立各种关系的,在Hibernate中则把数据库表与表之间的关系数据映 ...

  2. September 27th 2016 Week 40th Tuesday

    Friends are lost by calling too often and calling seldom. 交往过密过疏,都会失去朋友. Please mind your own busine ...

  3. 3ds max画曲线 设置摄像机的起始位置

    参考 http://www.3dmax8.com/3dmax/2013/0916/5661.html 如果想创建曲线段,可以在单击下一个点时按住鼠标不放,继续拖曳,再拖到另一个点上,单击鼠标右键,即可 ...

  4. Google earth

    装了Google earth之后,需要联网,才能放缩看不同精细程度的场景,除非你之前看过,在你自己的缓存中有存储. Google earth有自己的server,我们交互化的时候,server传数据给 ...

  5. 二、JavaScript语言--JS动画--JS动画效果

    运动框架实现思路: 1.速度(改变值:left , right , width , height , opacity) 2.缓冲运动 3.多物体运动 4.任意值改变 5.链式运动 6.同时运动 js用 ...

  6. Python中带参装饰器理解

  7. Linux下Vi/Vim使用笔记

    启动和关闭vim vi 打开 Vi/Vim 打开 Vi/Vim 并加载文件 <file> vi <file> vim编辑器的三种模式:一般模式.编辑模式和命令行模式在一般模式中 ...

  8. AR , VR, GVR ...

    虚拟现实与增强现实(眼镜或头盔)的现状与未来-简介http://blog.csdn.net/yanzhanyi/article/details/41982033 Google VR  |  Googl ...

  9. 安装oracle 12c RAC遇到的一些问题

    (1) 安装grid软件,停止在38%很长时间不动,日志显示正常   解决方法: 由于是虚拟机安装,设置的内存为600M,关闭虚拟机,把内存调成1GB,问题解决~在38%Linking RMAN Ut ...

  10. linux 下解压rar文件

    今天遇到要在linux 服务器上解压几个rar 文件的问题,rar似乎是win 专属的压缩格式,所以linux 原生工具链中并没有支持rar 解压的工具.经过一系列搜索确定了一个脚linuxrar 的 ...