随笔分类 -  .net

部分转载[C#性能优化实践]
摘要:全文出处:http://www.infoq.com/cn/articles/C-sharp-performance-optimization1.性能 主要指两个方面:内存消耗和执行速度。性能优化简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。2.理解瓶颈 99%的性能消耗是由于1%的代码造成的。大部分性能优化都是针对这1%的瓶颈代码进行的。具体实施也就分为两步:“发现瓶颈”和“消除瓶颈”。3.切忌过度 性能优化本身是有成本的。这个成本不单单体现在做性能优化所付出的工作量,还包括为性能优化而写出复杂的代码导致额外的维护成本,比如引入新的Bug,额外的内存 阅读全文

posted @ 2013-07-10 10:24 Gcam 阅读(205) 评论(0) 推荐(0)

C# 高级编程(笔记6)
摘要:第14章 反射1.自定义特性(Attribute)编译器在遇到代码中某个应用了自定义特性的元素时的处理过程:eg:[StringLength(50, ErrorMessageResourceType = typeof(res), ErrorMessageResourceName = "MAX_USER_NAME_LENGTH")]public String UName { get; set; }//当C#编译器发现这个属性(property)应用了一个StringLength特性时,首先会把字符串Attribute追加到这个名称的后面,形成一个组合名称StringLengt 阅读全文

posted @ 2013-03-24 10:41 Gcam 阅读(263) 评论(0) 推荐(0)

C# 高级编程(笔记5)
摘要:第11章 LINQ1. LINQ查询表达式必须以from子句开头,以select或group子名结束。在这两个子句之间,可以使用where、orderby、join、left和其他from子句2.Where语句原型 public static IEnumerable<Tsource> Where<Tsource>(this IEnumerable<Tsource> source, Func<Tsource, bool> predicate) { foreach (Tsource item in source) if (predicate(item 阅读全文

posted @ 2013-03-23 22:09 Gcam 阅读(198) 评论(0) 推荐(0)

C# 高级编程(笔记4)
摘要:第8章 委托、Lambda表达式和事件1.多播委托:一个委托中包含多个方法 如果调用多播委托,就可以按顺序连续调用多个方法,为此,委托的签名就必须返回void;否则,就只能得到委托调用的最后一个方法的结果,前面调用的方法返回结果被后面调用的方法返回的结果给覆盖了。 通过一个委托调用多个方法还可能导致一个大问题。多播委托包含一个逐个调用的委托集合。如果通过委托调用的其中一个方法抛出一个异常,整个迭代就会停止。 static void One() { Console.WriteLine("One"); throw new Exception("Err... 阅读全文

posted @ 2013-03-23 08:27 Gcam 阅读(211) 评论(0) 推荐(0)

C# 高级编程(笔记3)
摘要:第5章 泛型1.泛型类的静态成员 泛型类的静态成员只能在类的一个实例中共享 public class staticDemo<T> { public static int x; }由于同时对一个string类型和一个int类型使用了staticDemo<T>类,所以存在两组静态字段:staticDemo<string>.x = 4; staticDemo<int>.x = 5;Console.WriteLine(staticDemo<string>.x); //输出 42.协变和抗变:指对参数和返回值的类型进行转换假定有Shape和Re 阅读全文

posted @ 2013-03-22 22:16 Gcam 阅读(186) 评论(0) 推荐(0)

C# 高级编程(笔记2)
摘要:第四章1.接口 public interface ITty { void Put(); } a.一般情况下,接口只能包含方法、属性、索引器和事件的声明。不允许提供接口中任何成员的实现方式,只声明没有实现。 b.不能有构造函数,接口中的成员不能有访问修饰符,因为接口本来就是公共的(public), c.只要一个类继承了接口,它就得为接口中的所有方法提供实现2.隐藏方法 如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有分别声明为virtual 和 override,派生类方法就会隐藏基类方法。在大多数清况下是要重写方法,而不是隐藏方法,因为隐藏方法会造成... 阅读全文

posted @ 2013-03-20 22:50 Gcam 阅读(150) 评论(0) 推荐(0)

C# 高级编程(笔记1)
摘要:第三章1.方法重载不能仅根据方法的返回值类型来区分, 即:参数个数和参数类型都相同,只是函数的返回值不同,是不能作为函数的重载的2.结构的构造函数 为结构定义构造函数的方式与为类定义构造函数的方式相同,但不允许定义无参数的构造函数,因为编译器总是为其提供一个无参数的默认构造函数,它是不允许替换的。 结构中字段的初始值不能绕过默认构造函数,也就是必须在构造函数中完成初始化,且不能是无参构造函数 结构是值类型,不支持继承,结构中的new运算符与类和其他引用类型的工作方式不同。new运算符 并不分配堆中的内存,而是只调用相应的构造函数,根据传送给它的参数来初始化所有的字段。stFuct Dimens 阅读全文

posted @ 2013-03-19 21:57 Gcam 阅读(166) 评论(0) 推荐(0)

可空值类型[Nullable value type]
摘要:小结:可空值类型[Nullable value type]1. 一个值类型的变量永远不可能为null,它总是包含值类型的值本身。但某些情况下,这会带来问题。例如,设计一个数据库时,可以将一个列的数据类型定义成一个32位整数,并映射到FCL的Int32数据类型。但是,数据库中的一个列是允许值为空的,使用.Net Framework来处理数据库数据可能变得相当困难,因为CLR中没有办法将一个Int32值表示成null。为了解决这个问题,Microsoft在CLR中添加了可空值类型(nullable value type)【System.Nullable< T >】的概念。CLR中的定义 阅读全文

posted @ 2013-03-08 22:59 Gcam 阅读(438) 评论(0) 推荐(0)

关于GC
摘要:小结:1. 每个应用程序都有一组根(Root),一个根是一个存储位置,其中包含着一个指向引用类型对象的内存指针。该指针或者指向一个托管堆中的对象,或者被设为null。如:静态字段被认为是根,方法参数或局部变量也被认为是一个根,对于变量,仅当变量是引用类型时才被认为是根,值类型的变量永远不被认为是根。2. 垃圾收集当垃圾收集器开始工作时,它会首先假设托管堆中的所有对象都是可收集的垃圾。也就是说,垃圾收集器假设线程堆栈中没有一个变量引用堆中的对象,没有CPU寄存器引用堆中的对象,而且也没有静态字段引用堆中的对象。A. 垃圾收集的第一步(标记阶段)垃圾收集器遍历线程堆栈,检查所有的根,如果发现根引用 阅读全文

posted @ 2013-03-03 20:08 Gcam 阅读(284) 评论(0) 推荐(0)

关于接口与抽象类
摘要:小结:1. 接口只有方法名,没有方法体,由继承自它的类提供所有方法的实现,C#中规定类只能单继承,但可以通过接口来实现多继承,即一个类可以继承多个不同的接口2. 定义一个接口a. 不能定义构造函数b. 不能定义实例成员c. 不能定义静态成员3. 调用接口方法如:public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>String继承了多个接 阅读全文

posted @ 2013-03-03 10:12 Gcam 阅读(181) 评论(0) 推荐(0)

泛型与委托
摘要:小结:一、泛型【代码重用/算法重用】1.优点:a.源代码保护:使用泛型算法时不需要访问算法的源代码b.类型安全性c.更加清晰的代码d.更好的性能:CLR不再需要执行任何装箱、拆箱操作2.常用的泛型集合类/泛型容器a.List<T>b.Dictionary<TKey,TValue>c.Stack<T>d.Queue<T>3.代码爆炸使用泛型类型参数的一个方法在进行JIT编译时,CLR获取方法的IL,替换指定的类型参数,然后针对那个方法在指定数据类型上的操作创建特有的本地代码。这是泛型的主要特性之一,然而,这样做有一个缺点:CLR要为每种不同的方法/ 阅读全文

posted @ 2013-03-02 10:17 Gcam 阅读(340) 评论(0) 推荐(0)

构造函数的代码膨胀问题
摘要:1. 类1 public class A { private Int32 x = 15; }查看其默认的无参构造函数形成的IL Code:.method public hidebysig specialname rtspecialname instance void .ctor() cil managed{ // Code size 16 (0x10) .maxstack 8 IL_0000: ldarg.0 IL_0001: ldc.i4.s 15 IL_0003: stfld int32 ConsoleApplication9.... 阅读全文

posted @ 2013-02-28 23:14 Gcam 阅读(191) 评论(0) 推荐(0)

构造函数
摘要:小结:1. 引用类型的实例构造函数对于引用类型,如果没有显式为其定义任何构造函数,那么,许多编译器(包括c#编译器)将会定义一个默认的无参数构造函数,该构造函数的实现只是调用基类的无参构造函数,如public class SomeType{ ...}上述代码等同于下面的代码:public class SomeType{public SomeType():base(){ };}如果存在继承关系,编译器会自动产生调用基类无参构造函数的代码,沿着继承链一直到System.Object的无参构造函数。但实例构造函数是不能被继承的,只能被当前类使用,不能被子类调用。2. 值类型实例构造函数a. 值类型没 阅读全文

posted @ 2013-02-28 23:13 Gcam 阅读(207) 评论(0) 推荐(0)

关于参数
摘要:小结:1. 按引用传递参数在C#中可以使用关键字out或ref来实现按引用传递参数,从CLR的角度看,out与ref生成的元数据及IL代码都是相同的。a. out参数在传值前可以先赋值也可以不赋,但在方法返回时必须被赋值b. ref参数在传值前必须先赋值,在方法返回时可以修改其值c. 重载仅存在out和ref差异的方法是不合法的,因为这两个方法签名的元数据表示是相同的。如:public sealed class Point{ static void Add(out Int32 sx){...} static void Add(ref Int32 sx){...}}//这是不允许的d... 阅读全文

posted @ 2013-02-27 20:58 Gcam 阅读(228) 评论(0) 推荐(0)

基础(二)
摘要:小结:1. 静态类【static class】a. 不能被实例化,值类型(如:结构)不能用static修饰,因为CLR总是允许值类型可以被实例化。b. 静态类直接继承自System.Objectc. 静态类不能实现任何接口,因为接口中的方法是要通过接口的实现类实例化后访问的,而静态类是不能实例化的2. Constants【常量】a. 在编译期间赋值,隐式认为是static的,但是在声明时不能用static修饰b. 当我们的代码中引用了一个const常量时,compiler会先在程序集的metadata中查找该常量的声明,然后提取它的值并将其值直接放进IL Code中,也就是说在Runtime时 阅读全文

posted @ 2013-02-25 22:46 Gcam 阅读(196) 评论(0) 推荐(0)

关于基础类型
摘要:小结:1. 关于值类型与引用类型a. 值类型在线程栈上分配,不受垃圾回收器的控制,减少了托管堆的作用,所有的值类型都继承自System.ValueType, 后者继承自System.Object。b. 引用类型在托管堆上分配,受垃圾回收器的控制。c. 装箱与拆箱 装箱做了哪些操作? 1)统计值类型转引用类型所需的字节数 = 值类型本身所需要的字节数 + 类型对象指针 + 同步块索引 2)在托管堆上分配空间 3)把值类型中的域拷贝到分配的空间中 4)返回在堆中的地址 拆箱做了哪些操作?是不是装箱的相反过程?答案是否定的 拆箱中只把托管堆中的域拷回给值类型,但并不会拷贝类型对象指针以及同步块索引, 阅读全文

posted @ 2013-02-24 11:58 Gcam 阅读(164) 评论(0) 推荐(0)

CLR
摘要:小结:1. CLR 执行模型(略举3个托管模块,3个Resource files)2. 托管模块(Managed Module)是一个32位或64位的可移植执行文件,主要由IL和Metadata组成。其中Metadata是一系列数据表格,其中一些表格是用来记录该Module中定义的类型和成员,另外还有些数据表是用来记录该Module中引用的外界类型及成员3. CLR核心功能a. 内存管理b. 程序集的加载c. 异常的处理d. 线程同步e. 安全问题:如类型安全,不同的类型之间不能随意的进行转换,在Runtime时,CLR会作严格的检查,CLR允许同类型互转以及子类转成其父类 1)子类转父类 不 阅读全文

posted @ 2013-02-23 20:45 Gcam 阅读(310) 评论(0) 推荐(0)

运行时反射
摘要:摘录于<<clr via c#>> third version1.在编译时是不知道某个类型以及类型的实例中都含有哪些成员的,而在运行时,通过反射查看元数据信息可以获取类型,对象相关的详细信息。2.事实上,需要使用反射类型的应用程序还是比较少的。反射类型一般应用于一些类库,这些类库需要理解类型的定义,以便提供某些丰富的功能。例如,FCL的序列化机制就是使用反射来确定一个类型中定义了哪些字段,序列化格式器随后会获取这些字段的值,并将它们写入一个字节流中,以便在网上发送、保存到文件或者复制到剪贴板。类似地,VS设计器在设计时也使用反射来确定控件被放在Web窗体或者Window 阅读全文

posted @ 2012-12-16 21:07 Gcam 阅读(537) 评论(0) 推荐(0)

运行时序列化
摘要:摘录于<<clr via c#>> third version1.概念序列化:将对象转化成字节流反序列化:将字节流转化成对象2.作用a. asp.net通过序列化和反序列化的方式来保存和恢复会话状态,一个应用程序的状态可以很容易的保存在硬盘上或者数据库中,然后程序下次运行时可以再次从中恢复(检索)b. 一系列对象可以很容易的被拷贝到系统剪贴板上,然后在同一个或另一个程序里进行粘贴c. 一系列对象通过网络可以很容易的被传送给运行在另外一台机器上的一个进程,.NET的Remote 技术采用了这种方式d. 还可以在AppDomain之间传送对对象e. 只要把对象序列化成字节流 阅读全文

posted @ 2012-12-15 17:00 Gcam 阅读(285) 评论(0) 推荐(0)

Array与ArrayList
摘要:1. Arraypublic abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable{//////////////////}Array:长度是不变的(定长),里面的数据元素是同类型的,可以说Array是同一种数据类型的集合eg:Int32[] array = new Int32[5];Int32[] array = new Int32[] { 2, 3, 4 };//会根据初始化器中数据元素个数来确定该数组的大小2. Array 阅读全文

posted @ 2012-11-23 10:55 Gcam 阅读(173) 评论(0) 推荐(0)

导航