首页 > 代码库 > 改善C# 程序 的N个建议(6-10)
改善C# 程序 的N个建议(6-10)
建议6:分清readonly和const的使用方法.
首先区分他们的各自特点.
readonly:运行时常量.
const:编译期常量(决定了它肯定是静态的),只能修饰基元类型(string 也是属于基元类型),和枚举类型.
或许有人会问了,运行时常量和编译期常量有什么区别呢?那就先看一下代码
//代码片段 public static readonly int readonlyVar = 100; public const int constVar = 99; Console.WriteLine(readonlyVar.ToString()); Console.WriteLine(constVar.ToString());
编译之后:
public const int constVar=0x63; public readonly int readonlyVar; Console.WrintLine(this.readonlyVar.ToString()); Console.WrintLine(this.0x63.ToString());
编译后可以看到调用constVar的地方都是被”0x63”代替.而readonlyVar还是变量名.
运行时常量是在程序运行才被取值,运行时常量在产生IL时是产生该常量的引用.
编译期常量是在编译期就取值.
使用const的环境:系统中对于某个值是永恒不变的.比如.NET Framework 的Math.PI ( 3.14159) .(注意:如果修改它的值之后,引用它的项目都要重新编译).
使用readonly的环境:对象需要一次赋值,其生命周期内不变的常量.
建议7:将0作为枚举的默认值.
public enum Week { None=0, Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7 }
建议8:避免给枚举类型的元素提供显式的值
我个人不太赞同此条建议,我觉得为其显式赋值,代码看起来一目了然.
建议9:必须知道如何重载运算符.
比如Salary(薪水)类,如何让两个Salary相加?
public class Salary { public int RMB { get; set; } public static Salary operator +(Salary s1, Salary s2) { s2.RMB += s1.RMB; return s2; } }
这样就可以这样调用了:
Salary s1 = new Salary() { RMB = 100 }; Salary s2 = new Salary() { RMB = 200 }; Salary s3 = s1 + s2;
这是C#开发的基础知识,或许它不常用,但是必须知道.
建议10:必须知道如何实现类比较器
所谓的比较器就只是一个接口,也只需要实现一个方法(public int CompareTo(object obj)).实现了比较器有什么用呢?除了顾名思义的可以比较两个实例的大小.还可以用来排序(比如是List集合,就直接调用.Sort()方法就可以了.方便至极.定义Salay class:
public class Salary : IComparable<Salary> { public int RMB { get; set; } public int CompareTo(Salary obj) { if (this.RMB > obj.RMB) { return 1; } else if (this.RMB == obj.RMB) { return 0; } else { return -1; } } }
调用:
List<Salary> salarys = new List<Salary>(); for (int i = 0; i < 5; i++) { Salary salary = new Salary() {RMB=100*i }; salarys.Add(salary); } salarys.Sort(); foreach (var item in salarys) { Console.WriteLine(item.RMB); }
排序就变成如此简单.