【Clr in c#】方法
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.类型构造器
- 类型构造器的作用是设置类型的初始化状态,类型构造器没有参数,写法如下
class SomeRefType
{
static SomeRefType()
{
//SomeRefType被首次访问时,会执行这里的代码
}
}
- 定义类型构造器类似于定义无参实例构造器,区别在于必须标记为static,而且默认为私有,不能设置访问修饰符。
- 类型构造器中的代码只能访问静态字段,并且常规用途就是初始化这些字段,编译器会自动生成一个类型构造器,如下
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#】方法的更多相关文章
- 在SQL Server中使用CLR调用.NET方法
介绍 我们一起来做个示例,在.NET中新建一个类,并在这个类里新建一个方法,然后在SQL Server中调用这个方法.按照微软所述,通过宿主 Microsoft .NET Framework 2 ...
- CLR via C#深解笔记四 - 方法、参数、属性
实例构造器和类(引用类型) 构造器(constructor)是允许将类型的实例初始化为良好状态的一种特殊方法.构造器方法在“方法定义元数据表”中始终叫.ctor. 创建一个引用类型的实例时: #1, ...
- [CLR via C#]8. 方法
一.实例构造器和类(引用类型) 类实例构造器是允许将类型的实例初始化为良好状态的一种特殊的方法. 类实例构造器方法在"方法定义元数据表"中始终叫.ctor(代表constructo ...
- 重温CLR(六)方法和参数
实例构造器和类(引用类型) 构造器是将类型的实例初始化为良好状态的特殊方法.构造器方法在“方法定义元数据表”中始终叫做.ctor(constructor的简称).创建引用类型的实例时,首先为实例的数据 ...
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_方法执行
[前言] 方法执行前,CLR 会检测方法内代码引用的所有类型.同时 CLR 会分配一个内部数据结构,用来管理对所有引用的类型的访问. 首次执行方法时,托管程序集会把 IL 转换成本地 CPU 指令,并 ...
- C#夯实基础之接口(《CLR via C#》读书笔记)
一. 接口的类型 接口是引用类型.因此从值类型赋值给接口是需要装箱的.如下所示: class Program { static void Main(string[] args) { ISay catS ...
- 《CLR via C#》读书笔记(6)类型和成员基础
6.1 类型的各种成员 在一个类型中,可以定义0个或者多个以下种类的成员: 常量 常量是在编译时设置其值并且永远不能更改其值的字段.使用常量可以为特殊值提供有意义的名称以代替数字文本,以使代码变得更容 ...
- CLR执行模式之程序集代码的执行
所知IL是与CPU无关的机器语言,其能访问和操作对象类型,并提供指令来创建和初始化对象,调用对象上的虚方法以及直接操作数组对象等,故可视为一种面向对象的机器语言.每种语言的存在都有其存在的价值和原因, ...
- 【CLR VIA C#】读书笔记
工作几年了才看,记录下笔记备忘. 章节 笔记 1.CLR的执行模型 公共语言运行时(Common Language Runtime,CLR) 源代码-->编译器检查语法和分析源代码-->托 ...
- CLR via C# - CLR模型
博客园对markdown支持不佳,错乱移步Github IO 博文 CLR 的执行模型 模块/程序集 1.模块 托管模块组成部分 PE32/PE32+头 : PE即Portable Executabl ...
随机推荐
- Servlet题库
一. 填空题 Servlet中使用Session对象的步骤为:调用 HttpServletRequest.getSession() 得到Session对象,查看Session对象,在会话中保 ...
- SSH详解
Secure Shell (SSH) 是一个允许两台电脑之间通过安全的连接进行数据交换的网络协议.加密保证了数据的保密性和完整性.SSH采用公钥加密技术来验证远程主机,以及(必要时)允许远程主机验证用 ...
- .net 获取https页面的信息 在iis7.5服务器上不管用
让我纠结了一天多的问题,给大家看下,有相同情况的可以不用浪费时间了,本人当时找了好半天都没找到什么有用的信息,项目在本地没有问题,但部署在服务器后,获取不到https页面的信息,加入下面的代码就可以了 ...
- JavaScript数组排序
JavaScript的sort方法排序是有问题的,我们可以给sort方法传一个参数 function Compare(value1, value2) { //数字排序的函数参数 if (value1 ...
- iPhone:4.7 5.5 4 3.5 对应的各个设备屏幕尺寸对应的像素及App上线信息
Shared App Information You can access these properties from the App Details page in the App Informat ...
- PostgreSQL中COUNT的各条件下(1亿条数据)例子
test=# insert into tbl_time1 select generate_series(1,100000000),clock_timestamp(),now(); INSERT 0 1 ...
- 1.Windows安装PostgreSQL
按照下面的步骤,Windows机器上安装PostgreSQL.请确保已开启第三方防病毒,同时安装. 挑选你想要的PostgreSQL的版本号,可以点击以下链接下载 EnterpriseDB Windo ...
- Lattice 的 Framebuffer IP核使用调试笔记之datasheet笔记
本文由远航路上ing 原创,转载请标明出处. 学习使用以及调试Framebuffer IP 核已经有一段时间了,调试的时候总想记录些东西,可是忙的时候就没有时间来写,只有先找个地方记录下,以后再总结. ...
- Arch Linux Installation Guide
Arch Linux Installation Guide timedatectl set-ntp true sed -i '/Score/{/China/!{n;s/^/#/}}' /etc ...
- tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片
本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...