品牌网站官网,wordpress替换主题,爱做网站yeele,123浏览器下载//编写高质量的代码#xff0c;改善c#程序的157个建议# 1、正确操作字符串## 1* 确保尽量少的装箱* 避免分配额外的内存空间1. 会进行一次装箱C#string str1str19;2. 没有装箱#xff0c;调用的是整型的ToString方法C#string str2str29.ToString();#… //编写高质量的代码改善c#程序的157个建议 # 1、正确操作字符串 ## 1 * 确保尽量少的装箱 * 避免分配额外的内存空间 1. 会进行一次装箱 C# string str1str19; 2. 没有装箱调用的是整型的ToString方法 C# string str2str29.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 secondTypenew 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 secondTypenew SecondType(){NameSecond Type}; FirstType firstType1(FirstType)secondType; FirstType firstType1secondType as FirstType; } } class FirstType { public string Name{get;set;} } class SecondType:FirstType { } //另一种版本 if (obj is SecondType) { SecondType secondTypeobj as SecondType; //ToDo } # 4、TyParse比Parse好 如果转换的结果是对的那么这两种的效率在相同的数量级如果转换失败前者效率比后者高很多! # 5、使用int来确保值类型也可以为null 语法T是NullableT的简写两者可以相互转换。可以为null的类型表示其基础值类型正常范围内的值再加上一个null值。例如NullableInt32,其值的范围为-2147483648~2147483647再加上一个null值。 * 基元类型提供了其对应的可空类型的隐式转换 C# int? inull; int j0; ij; * 反过来可空类型不可隐式转换为对应的基元类型 C# int? i123; int j; //繁琐的代码 if(i.HasValue) { ji.Value; } else { j0; } //简化的代码 int? i123; int ji??0; # 6、区别readonly和const的使用方法 * const是一个编译期常量readonly是一个运行时常量。 ### 1对于值类型变量值本身不可改变。 ### 2对于引用类型变量引用本身相当于指针不可改变。 C# /*****值类型变量*****/ calss Sample { public readonly int ReadOnlyValue; public Sample(int value) { readOnlyValuevalue; } } //Sample的实例在构造方法中被赋值后就不可以改变 Sample samplenew Sample(200); sample.ReadOnlyValue300; /*******引用类型变量*****/ class Sample2 { public readonly Student ReadOnlyValue; public Sample2(Student value) { ReadOnlyValuevalue; } } //赋值后变量不能再指向任何其他的Student实例 Sample2 sample2new Sample2(new Student(){Age10}); sample2.ReadOnlyValuenew Student(){Age20}; //引用本身不可改变引用所指实例的值却可以改变 sample2new Sample2(new Student(){Age10}); sample2.ReadOnlyValue.Age20; * const只能修饰基元类型、枚举类型或者字符串类型readonly没有限制。 # 78、将0值作为枚举的默认值避免给枚举类型的元素提供显式的值 允许使用的枚举类型有byte、sbyte、short、ushort、int、uint、long和ulong。始终将0值作为枚举类型的默认值。 C# //应该将显示为元素的赋值去掉编译器会自动从0值开始计数然后逐个为元素的值1 enum Week { Monday1, Tuesday2, Wednesday3, Thursday4, Friday5, Saturday6, Sunday7 } //枚举元素允许设定重复得值 enum Week { Monday1, Tuesday2, ValueTemp, Wednesday3, Thursday4, Friday5, Saturday6, Sunday7 } //下边代码输出为Wednesday Week weekWeek.ValueTemp; Console.WriteLine(week);//上一个枚举值加一 转载于:https://www.cnblogs.com/mengwy/p/11371032.html