首页 > 代码库 > 改善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
 }
此条建议为了Week在没赋值的时候,取默认值就为”0”.这条处理方式更好,只是种较良的改善.

建议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);
            }

排序就变成如此简单.