zoukankan      html  css  js  c++  java
  • 编写高质量的代码,改善c#程序的157个建议_之1~10

    //编写高质量的代码,改善c#程序的157个建议
    # 1、正确操作字符串
    ## 1
    * 确保尽量少的装箱
    * 避免分配额外的内存空间

    1. 会进行一次装箱
    ````C#
    string str1="str1"+9;
    ````
    2. 没有装箱,调用的是整型的ToString方法
    ````C#
    string str2="str2"+9.ToString();
    ````

    # 2、使用默认转换类型
    * 使用类型的转换运算符
    * 使用类型内置的Parse、TryParse,或者如ToString、ToDouble和ToDataTime等方法
    * 使用帮助类提供的方法
    * 使用CLR支持的转型

    ## 1、使用类型转换运算符
    使用类型内部的一个方法:隐式转换和显式转换,用户自定义的类型通过重载运算符提供这一类转换。
    ## 2、使用类型内置的Parse、TryParse,或者如ToString、ToDouble和ToDataTime等方法
    在FCL中,如果某个类型经常需要进行转型操作,类型自身则会带有一些转型方法。
    ## 3、使用帮助类提供的方法
    可以使用如System.Convert类、System.Converter类来进行类型转换。
    ## 4、使用CLR支持的转型
    CLR支持的转型,即上溯转型和下溯转型。基类和子类之间的转换

    # 3、区别对待强制转型与as和is
    ````C#
    secondType=(SencondType)firstType;
    ````
    强制转型意味着两件不同的事情:
    * 1> firstType和SencondType彼此依靠转换操作符来完成两个类型之间的转型
    如果类型之间都上溯到了某个共同的基类,那么根据此基类进行的转(即基类转型为子类本身)应该使用as。子类与子类之间的转型,则应该提供转换操作符,以进行强制转型。
    ````C#
    //对比两种类型
    class FirstType
    {
    public string Nmae{get;set;}
    }
    class SecondType
    {
    public string Name{get;set;}
    public static explicit operator SecondType(FirstType firstType)
    {
    SecondType secondType=new SecondType(){Name="转型自:" + firstType};
    return secondType;
    }
    }
    //使用过程
    static void DoWithSomeType(object obj)
    {
    SecondType secondType=(SecondType)obj;//参数是firstType会引发异常

    SecondType secondType= obj as SecondType;//这个时候输入的参数可以是firstType!
    if(secondType!=null)
    {
    //ToDo
    }
    }
    ````
    * 2> FirstType是SencondType的基类
    既可以使用强制转型,也可以使用as操作符;建议使用as操作符
    ````C#
    class Program
    {
    static void Main(string[] args)
    {
    SecondType secondType=new SecondType(){Name="Second Type"};
    FirstType firstType1=(FirstType)secondType;
    FirstType firstType1=secondType as FirstType;
    }
    }
    class FirstType
    {
    public string Name{get;set;}
    }
    class SecondType:FirstType
    {
    }
    //另一种版本
    if (obj is SecondType)
    {
    SecondType secondType=obj as SecondType;
    //ToDo
    }
    ````

    # 4、TyParse比Parse好
    如果转换的结果是对的,那么这两种的效率在相同的数量级;如果转换失败前者效率比后者高很多!
     
    # 5、使用int?来确保值类型也可以为null
    语法T?是Nullable<T>的简写,两者可以相互转换。可以为null的类型表示其基础值类型正常范围内的值再加上一个null值。例如,Nullable<Int32>,其值的范围为-2147483648~2147483647,再加上一个null值。
    * 基元类型提供了其对应的可空类型的隐式转换
    ````C#
    int? i=null;
    int j=0;
    i=j;
    ````
    * 反过来,可空类型不可隐式转换为对应的基元类型
    ````C#
    int? i=123;
    int j;
    //繁琐的代码
    if(i.HasValue)
    {
    j=i.Value;
    }
    else
    {
    j=0;
    }
    //简化的代码
    int? i=123;
    int j=i??0;
    ````

    # 6、区别readonly和const的使用方法

    * >const是一个编译期常量,readonly是一个运行时常量。
    ### 1>对于值类型变量,值本身不可改变。
    ### 2>对于引用类型变量,引用本身(相当于指针)不可改变。
    ````C#
    /*****值类型变量*****/
    calss Sample
    {
    public readonly int ReadOnlyValue;
    public Sample(int value)
    {
    readOnlyValue=value;
    }
    }
    //Sample的实例在构造方法中被赋值后就不可以改变
    Sample sample=new Sample(200);
    sample.ReadOnlyValue=300;
    /*******引用类型变量*****/
    class Sample2
    {
    public readonly Student ReadOnlyValue;
    public Sample2(Student value)
    {
    ReadOnlyValue=value;
    }
    }
    //赋值后,变量不能再指向任何其他的Student实例
    Sample2 sample2=new Sample2(new Student(){Age=10});
    sample2.ReadOnlyValue=new Student(){Age=20};
    //引用本身不可改变,引用所指实例的值却可以改变
    sample2=new Sample2(new Student(){Age=10});
    sample2.ReadOnlyValue.Age=20;
    ````
    * >const只能修饰基元类型、枚举类型或者字符串类型,readonly没有限制。

    # 7&8、将0值作为枚举的默认值&避免给枚举类型的元素提供显式的值
    允许使用的枚举类型有byte、sbyte、short、ushort、int、uint、long和ulong。始终将0值作为枚举类型的默认值。
    ````C#
    //应该将显示为元素的赋值去掉,编译器会自动从0值开始计数,然后逐个为元素的值+1
    enum Week
    {
    Monday=1,
    Tuesday=2,
    Wednesday=3,
    Thursday=4,
    Friday=5,
    Saturday=6,
    Sunday=7
    }
    //枚举元素允许设定重复得值
    enum Week
    {
    Monday=1,
    Tuesday=2,
    ValueTemp,
    Wednesday=3,
    Thursday=4,
    Friday=5,
    Saturday=6,
    Sunday=7
    }
    //下边代码输出为:Wednesday
    Week week=Week.ValueTemp;
    Console.WriteLine(week);//上一个枚举值加一
    ````






  • 相关阅读:
    3、SpringBoot执行原理
    10、@Controller跟@RestController注解的使用
    2、Spring项目的创建【官网跟IDEA】
    1、了解SpringBoot
    PHP算法之IP 地址无效化
    PHP算法之宝石与石头
    MYSQL查询查找重复的电子邮箱
    PHP算法之猜数字
    PHP算法之盛最多水的容器
    PHP算法之回文数
  • 原文地址:https://www.cnblogs.com/mengwy/p/11371032.html
Copyright © 2011-2022 走看看