基础笔记(一):C#编程要点
前言
来源于手中日常摘录的资料和书籍,算是对看过的东西的总结,部分注有阅读心得,也有部分只提出大纲或结论。(备注:本篇文章中大部分要点需要有实际的开发经验,有助于阅读理解。)
目录
- const和readonly
- is、as
- 条件编译#if #endif和Conditional特性
- 等同性判断
- GetHashCode()陷阱
- 委托
- 资源管理(GC、终结器、IDisposable、using)
- 创建第一个实例所进行的操作顺序
- 编译的生命周期
一、const和readonly
当编译期常量const被编译成IL时,它就已经被替换成所代表的字面数值。所以更改一个公有的编译期常量的值,需要重新编译所有引用到该常量的代码以保证所有代码使用的是最新的常量值。
二、is、as
分两种情况:
三、条件编译#if #endif和Conditional特性
四、等同性判断
五、GetHashCode()陷阱

- 如果两个对象相等(由operator==判断),那么它们必须生成相同散列码。否则,这样的散列码将无法用来查找容器中的对象。System.Object:满足此规则;System.ValueType:并非所有参与等同性判断的属性都会用来进行散列码计算,而是返回struct类型中定义的第一个字段的散列码作为当前值类型的散列码,所以可以认定等同性判断相等的散列码肯定相等(反过来,散列码相等同性判断不一定相等)。满足此规则。
- 对于任何一个对象A,A.GetHashCode()必须保持不变。不管在A上调用什么方法,A.GetHashCode()都必然总是返回同一个值。这样可以确保放在“桶”中的对象总是位于正确的“桶”中。System.Object:满足此规则;System.ValueType:struct中的第一个字段是一个常量字段,不会在生存期发生改变(称为不可变的值类型),满足此规则。
- 对于所有的输入,散列函数应该在所有整数中按照随机分布生成散列码。这样,散列容器才能得到足够的效率提升。System.Object:系统每创建一个对象时会指派一个唯一的对象键(一个整数值),从1开始,每创建一个任意类型的新对象,键值会随之增长,虽然System.Object.GetHashCode()能正常工作,但因为不是随机分布,效率不高,所以没有满足此规则,新建引用类型时建议覆写GetHashCode();System.ValueType:依赖于第一个字段的使用方式,如果取任意值,GetHashCode()可以产生比较均匀的分布,但如果取相同的值则没有此满足规则。
六、委托
- Predicate<T>:表示一个提供布尔型返回值的函数;
- Action<T1,T2>:接受任意参数目的参数;
- Func<T1,T2,ResultT>:接受零到多个参数,并返回单一结果;
- 在多播委托调用过程中,每个目标函数会被依次调用。委托对象本身不会捕获异常。因此,任何目标抛出的异常都会结束委托链的调用,如果有委托调用出现异常,那么这种方式不能保证安全;
- 整个调用的返回值将为最后一个函数调用的返回值,前面函数的返回值将会被忽略;


.NET的事件模式就是观察者模式
public event EventHandler<LoggerEventArgs> Log;
编译器会自动创建类似下面的代码,根据需要可以自己编写
private EventHander<LoggerEventArgs> log;
public event EventHander<LoggerEventArgs> Log
{
add{log=log+value;}
remove{log=log-value;}
}
事件相当于一个委托集合,可以添加多个同类型委托(通过+=);
七、资源管理




- 释放所有非托管资源;
- 释放所有托管资源,包括释放事件监听程序;
- 设定一个状态标识,表示该对象已经被销毁。若是在销毁后再次对用对象的公有方法,那么应该抛出ObjectDisposed异常;
- 调用GC.SuppressFinalize(this),跳过终结操作;
八、创建第一个实例所进行的操作顺序
- 静态变量设置为0;
- 执行静态变量初始化器;
- 执行基类的静态构造函数;
- 执行静态构造函数;
- 实例变量设置为0;
- 执行实例变量初始化器;
- 执行基类中合适的实例构造函数;
- 执行实例构造函数;
九、编译的生命周期

相关资料:
- 《C#高效编程:改进C#代码的50个行之有效的方法》(第2版)
作者:B.it
出处:http://www.cnblogs.com/ImBit/p/5484920.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

基础笔记(一):C#编程要点的更多相关文章
- [.NET] 《Effective C#》快速笔记 - C# 高效编程要点补充
<Effective C#>快速笔记 - C# 高效编程要点补充 目录 四十五.尽量减少装箱拆箱 四十六.为应用程序创建专门的异常类 四十七.使用强异常安全保证 四十八.尽量使用安全的代码 ...
- Python基础笔记:函数式编程:高阶函数、返回函数、匿名函数
高阶函数 高阶函数:一个函数可以接收另一个函数作为参数 或 一个函数可以返回一个函数作为返回值,这种函数称之为高阶函数. #函数 add 接收 f 函数作为参数 >>> def ad ...
- 《Effective C#》快速笔记(六)- - C# 高效编程要点补充
目录 四十五.尽量减少装箱拆箱 四十六.为应用程序创建专门的异常类 四十七.使用强异常安全保证 四十八.尽量使用安全的代码 四十九.实现与 CLS 兼容的程序集 五十.实现小尺寸.高内聚的程序集 这是 ...
- 《Essential C++》读书笔记 之 C++编程基础
<Essential C++>读书笔记 之 C++编程基础 2014-07-03 1.1 如何撰写C++程序 头文件 命名空间 1.2 对象的定义与初始化 1.3 撰写表达式 运算符的优先 ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- Java 编程要点之并发(Concurrency)详解
计算机用户想当然地认为他们的系统在一个时间可以做多件事.他们认为,他们可以工作在一个字处理器,而其他应用程序在下载文件,管理打印队列和音频流.即使是单一的应用程序通常也是被期望在一个时间来做多件事.例 ...
- MYSQL基础笔记(三)-表操作基础
数据表的操作 表与字段是密不可分的. 新增数据表 Create table [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段n 数据类型 --最后一行不需要加逗号 ...
- WCF学习笔记之事务编程
WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. . ...
- JavaScript基础笔记集合(转)
JavaScript基础笔记集合 JavaScript基础笔记集合 js简介 js是脚本语言.浏览器是逐行的读取代码,而传统编程会在执行前进行编译 js存放的位置 html脚本必须放在&l ...
随机推荐
- C# await和async
基础阅读:http://www.cnblogs.com/jesse2013/p/async-and-await.html 答疑阅读:http://www.cnblogs.com/heyuquan/ar ...
- ASP.NET Core 中文文档 第四章 MVC(4.4)依赖注入和控制器
原文: Dependency Injection and Controllers 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core MVC 控制器应通过 ...
- bzoj4724--数论
题目大意: B进制数,每个数字i(i=0,1,...,B-1)有a[i]个.你要用这些数字组成一个最大的B进制数X(不能有前导零,不需要 用完所有数字),使得X是B-1的倍数.q次询问,每次询问X在B ...
- JAVA环境变量和TomCat服务器配置
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...
- Android6.0运行时权限管理
自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...
- IOS开发之—— 在AFN基础上进行的网络请求的封装
网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的. 1发送网络请求:get/post/或者别的 带上URL,需要传的参数 2判断后台网络状态码有没有请求成功: 3 请求 ...
- ABP教程-给项目添加SwaggerUI,生成动态webapi
上一篇,我们是正式将ABP生成的代码项目,跑起来了,然后演示了下多租户的不同.那么这篇我们就来实现下SwaggerUI. Q:SwaggerUI是干什么的呢? A:他是一个能将我们的webapi,通过 ...
- .net(c#)版RSA加密算法,拿走不谢
今天有同学对接一个支付平台,涉及到RSA的签名和验签.由于对方是java的sdk,翻成c#语言时,搞了半天也没搞定.网上搜的东西都是各种copy还不解决问题. 碰巧,我之前对接过连连银通的网银支付和代 ...
- AngularJs之六(服务)
服务:AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用.AngularJS 内建了30 多个服务. 最常用的服务:$location 服务, $http 服务 ...
- Java环境变量-Linux环境
环境变量说明 JAVA_HOME 它指向jdk的安装目录,Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk. PATH 作用是指定命令搜 ...