C#
marvel_cheng
假如生活欺骗了你!不要悲伤,不要心急!忧郁地徜徉在计算机的世界里,众多算法都将仰望你。
展开
-
提高C#编程水平的50个要点 之一“总是用属性 (Property) 来代替可访问的数据成员(field)”
好的面向对象编程习惯是提供公开的访问器,让客户代码有效的操作选择的私有Attribute的同时,也可以使对象本身能很好的控制这些Attribute,保护业务逻辑的正常运作有2种实现访问器的方法:1.面向对象编程语言的普通手法提供get和set的方法分别用来提取和修改Attribute.编写一个最简单的类Author来实现我们的访问器 程序代码[c转载 2017-03-01 15:56:00 · 431 阅读 · 0 评论 -
提高C#编程水平的50个要点 之十五“使用 using 和 try-finally 来处理资源的释放”
使用非托管资源的类型必须实现IDisposable接口的Dispose()方法来精确的释放系统资源。.Net环境的这一规则使得释放资源代码的职责是类型的使用者,而不是类型或系统。因此,任何时候你在使用一个有Dispose()方法的类型时,你就有责任来调用Dispose()方法来释放资源。 最好的方法来保证Dispose()被调用的结构是使用using语句或者try/finally块。转载 2017-03-02 10:12:45 · 859 阅读 · 0 评论 -
提高C#编程水平的50个要点 之十四“用多个构造函数时,利用构造函数链”
在一个类中如果需要实现多个自定义构造函数,通常做法是在构造函数中实现各自的业务逻辑,如果这些业务逻辑的实现并非截然不同的话,显然不符合oop编程思想,极不利于维护,当然,我们也可以通过将相同的逻辑部分封装成一个方法,但还有一种更为合理简单的方法,下面就通过构造函数链来实现串联构造函数的简单示例。示例代码如下:public class Person{原创 2017-03-02 10:00:17 · 1093 阅读 · 0 评论 -
提高C#编程水平的50个要点 之十三“使用静态构造函数来初始化静态成员变量”
编写程序的时候难免要使用到静态成员,由于静态成员的访问是脱离类型对象的,所以使用非静态构造函数,私有方法或者一些其他方法进行静态变量的初始化都是不合理的。 .net提供了成员初始化语句和静态构造函数来初始化静态成员,但我们知道静态成员的初始化语句会早于静态构造函数执行,其次还知道成员初始化语句的好处和一些限制。要提的一点就是,静态构造函数和实例构造函数之间的区别,因为静态构造函数是由CLR调原创 2017-03-02 09:42:50 · 1660 阅读 · 0 评论 -
提高C#编程水平的50个要点 之十二“在定义变量的时候就将其初始化”
C#变量初始化是C#强调安全性的一个例子。简单地说,C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量。大多数现代编译器把没有初始化标记为警告,但C#编译器把它当作错误来看待。这就可以防止我们无意中从其他程序遗留下来的内存中获取垃圾值。C#变量初始化的操作中有两个方法可确保变量在使用前进行了初始化:1、变量是类或结构中的字段,如果没有显式初始化,创建这些变量原创 2017-03-02 09:21:32 · 387 阅读 · 0 评论 -
提高C#编程水平的50个要点 之十一“在编写循环时,优先使用foreach”
C#的foreach语句不仅仅只是do...while或者for循环语句的一个变体。它会为我们的集合产生最好的遍历代码。实际上,foreach语句的定义和.NET框架中的集合接口密切相关。对于一些特殊的集合类型,C#编译器会产生具有最佳效率的代码。遍历集合时,我们应该使用foreach语句,而非其他的循环构造。例如,对于下面三种循环:int [] foo = new int[100];转载 2017-03-02 08:57:08 · 615 阅读 · 0 评论 -
提高C#编程水平的50个要点 之十“理解 GetHashCode 方法的缺陷”
1. GetHashCode的用途用于基于Hash的数据结构的key。Object.GetHashCode 的实现只能保证将为相同的实例返回相同的哈希代码;它无法保证不同的实例将具有不同的哈希代码,或者两个引用相同值的对象将具有相同的哈希代码。.NET框架的不同版本对于相同的实例也可能会生成不同的哈希代码。 2.特点因为你的对象要放到散列里面作为ke y 。你不希望的是语义上相同的原创 2017-03-01 17:02:15 · 1986 阅读 · 0 评论 -
提高C#编程水平的50个要点 之九“理解Reference Equals(), static Equals(), instance Equals(), 和运算行符==之间的关系”
C#充许你同时创建值类型和引用类型。两个引用类型的变量在引用同一个对象时,它们是相等的,就像引用到对象的ID一样。两个值类型的变量在它们的类型和内容都是相同时,它们应该是相等的。这就是为什么相等测试要这么多方法了。先从两个你可能从来不会修改的方法开始。ReferenceEquals():Object.ReferenceEquals()在两个变量引用到同一个对象时返回true,也就是两个转载 2017-03-01 16:42:33 · 565 阅读 · 0 评论 -
提高C#编程水平的50个要点 之八“在值类型中,确保0是一个合法的数据”
.Net系统默认所有的对象初始化时都为0。这并没有提供一个方法来预防其他程序员创建的值类型数据的实例在初始化是都是0。请让你的数据类型默认值也是0。一个特殊情况是在枚举类型数据中。决不要创建一个不包括0在内 的枚举类型。所有的枚举类型都是从System.ValueType派生的。枚举类型的值是 从0开始的,但你可以改变这一行为:public enum Planet{转载 2017-03-01 16:35:18 · 458 阅读 · 0 评论 -
提高C#编程水平的50个要点 之七 “使用不可变的值类型(Immutable Atomic Value Types)”。
不可变类型很简单:当他们被创建后,它们的值就不可改变。这样可以为我们减少很多负担,否则你必需时时小心这些对象在创建后是否会因修改而改变。不可变类 型对于多线程来说也是安全的,它们只能得到相同的结果。不可变类型可以让对象更安全,调用者不能改变它们的内容。不可变类型在基于哈希的集合中工作的很好,Object.GetHashCode()返回的值就是不可变类型的。 并不是原创 2017-03-01 16:30:51 · 687 阅读 · 0 评论 -
提高C#编程水平的50个要点 之六 “区别值类型和引用类型”。
一、总的区别 值类型 引用类型内存分配地点 分配在栈中转载 2017-03-01 16:25:34 · 245 阅读 · 0 评论 -
提高C#编程水平的50个要点 之五“总是为自定义类重载 ToString 方法”。
System.Object.ToString()恐怕是.NET中最常用的方法了。应该为我们的类的所有客户代码提供一个合理的版本,否则这些代码就只能使用我们的类的一些属性来自己定制可读的表示了。类型的字符串表示非常有用,可以在很多地方向用户显示对象的有关信息,例如在Windows Forms上、Web Forms上、控制台输出窗口中,以及调试环境中。为此,我们创建的每一个类型都应该重写Obj转载 2017-03-01 16:20:53 · 958 阅读 · 0 评论 -
提高C#编程水平的50个要点 之四“使用条件属性 (Conditional Attributes) 来代替条件编译语句 #if”
使用#if/#endif 块可以在同样源码上生成不同的编译(结果),大多数debug和release两个版本。但它们决不是我们喜欢用的工具。由于#if/#endif很容易被滥用,使得编写的代码难于理解且更难于调试。程序语言设计者有责任提供更好的工具,用于生成在不同运行环境下的机器代码。C#就提供了条件属性(Conditional attribute)来识别哪些方法可以根据环境设置来转载 2017-03-01 16:15:59 · 743 阅读 · 0 评论 -
提高C#编程水平的50个要点 之三“在 as 和 强制类型转换之间,优先使用 as 操作符”。
在程序中,进行类型转换是常见的事。那么在C#中支持以前语言的类型转换方法,即用类型名进行强行转换,例如:object objTest = new NewType();NewType newValue = (NewType)objTest;但是这样转换,有个严重的问题,就是在把objTest强转换成NewType类型对象的时候,这个过程是不安全的,因此需要转载 2017-03-01 16:09:19 · 1184 阅读 · 0 评论 -
提高C#编程水平的50个要点 之二“在 readonly 和 const 之间,优先使用 readonly”
C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。工作原理 readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。 const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值。 下面声明两个常量:转载 2017-03-01 16:03:09 · 300 阅读 · 0 评论 -
提高C#编程水平的50个要点 之十六“尽量避免产生资源垃圾”
对于.Net所写一般程序来说,都属于托管程序,内存的释放和回收是由Garbage Collector完成。但是相对于栈上内存操作而言,GC回收堆上的内存,会消耗更多的CPU时间.因此如果让GC不停的释放和回收内存,会造成程序性能的下降。例如对于如下这段程序而言。 protected override void OnPaint(PaintEventArgs e)转载 2017-03-02 10:45:46 · 536 阅读 · 0 评论