千家信息网

C# 语言习惯

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,一、使用属性而不是可访问的数据成员二、使用运行时常量(readonly)而不是编译时常量(const)1. C# 有两种类型的常量:编译时常量和运行时常量。2.尽量使用运行时常量,而不是编译时常量。
千家信息网最后更新 2026年10月31日C# 语言习惯

一、使用属性而不是可访问的数据成员

二、使用运行时常量(readonly)而不是编译时常量(const)

  1. C# 有两种类型的常量:编译时常量和运行时常量。

  2.尽量使用运行时常量,而不是编译时常量。

        ///         /// 编译时常量        ///         public const int Num = 100;        ///         /// 运行时常量        ///         public static readonly int Year = 2017;

  3.编译时常量只能用于数字和字符串,运行时常量也是一种常量,因为在构造函数执行后它不能被再次修改。

  4.const 比 readonly 效率高,但灵活性低。

三、推荐使用 is 或 as 操作符而不是强制类型转换

  1.as 比强转更加高效、安全。

  2.as 操作符不能配合值类型使用,因为值类型永远不可能为 null。

四、使用 Conditional 特性而不是 #if 条件编译

五、为类型提供 ToString() 方法

  1.应该为类型提供一个合适的 ToString() 版本,否则使用者会根据类的一些属性来自行构造并用于显示。

  2.object 默认提供的 ToString() 方法会返回类型的完整名称,意义不大。如:System.Drawing.Rect。

  3.重写所有类型的 ToString(),可以简单明了的显示对象的摘要信息。

六、理解几个等同性判断之间的关系

  1.系统提供 4 种函数判断两个对象是否"相等"。

  2.对于前两种方法,我们永远不要重新定义,我们通常要重写 Equals 方法。

  3.重写 Equals 的类型也要实现 IEquatable,如果是结构体的话需要实现 IStructuralEquatable。

  4.引用同一个 DataRow,会认为相等,如果想比较内容的话,而不是引用地址,那么就应该重写 Equals() 实例方法。

  5.Equals() 实例方法的重写原则:对于所有的值类型,都应该重写 Equals() 方法,对于引用类型,如果不能满足需要时才去重写该方法。重写该方法的同时也需要重写 GetHashCode() 方法。

  6.operator == ():只要创建的是值类型,都必须重新定义 operator == (),因为系统默认是通过反射来比较两个值是否相等,效率过低。

七、理解 GetHashCode() 的陷阱

  1.对于我们实现的大多数类型来说,避免实现 GetHashCode()。

  2.GetHashCode() 的重载版本必须遵循以下三条原则:

  (1)如果两个对象相等(由 operator == 定义),那么它们必须生成相同的散列码。

  (2)对于任何一个对象 A,A.GetHashCode() 必须保持不变。

  (3)对于所有的输入,散列函数应该在所有整数中按照随机分布生成散列码。

八、推荐使用查询语法而不是循环

  示例:

            //1.使用循环            var foo = new int[100];            for (int i = 0; i < 100; i++)            {                foo[i] = i * i;            }            //使用查询语法            var foo2 = (from n in Enumerable.Range(0, 100) select n * n).ToArray();

  1.有些方法语法没有对应的查询语法,如 Take、TaskWhile、Skip、SkipWhile、Min、Max 等,就需要使用方法语法。

九、避免在 API 中使用转换操作符

十、使用可选参数减少方法重载的数量

  1.对于程序集的第一次发布,可以随意使用可选参数和命名参数。而在进行后续发布时,必须为额外的参数创建重载。这样才能保证现在的程序仍能正常运行。此外,在任何的后续发布中,都要避免修改参数的名称,因为参数名称已经成为公有接口的一部分。

十一、理解短小方法的优势

  1.我们最好尽可能地编写出最清晰的代码,将优化工作交给 JIT 完成。一个常见的错误优化是,我们将大量的逻辑放在一个函数中,以为这样可以减少额外的方法调用开销。

        public string Test(bool isTrue)        {            var sb = new StringBuilder();            if (isTrue)            {                sb.AppendLine("A");                sb.AppendLine("B");                sb.AppendLine("C");            }            else            {                sb.AppendLine("E");                sb.AppendLine("F");                sb.AppendLine("G");            }            return sb.ToString();        }

  在第一次调用 Test 方法时, if-else 的两个分支都被 JIT 编译,而实际上只需要编译其中一个,修改后:

        public string Test2(bool isTrue)        {            var sb = new StringBuilder();            if (isTrue)            {                return Method1();            }            else            {                return Method2();            }        }

  现在进行了方法拆分,这两个方法就可以根据需要进行 JIT 编译,而不必第一次进行全部编译。

  2.可以将 if-else 分支中有超过几十条的语句,或者某个分支专门用来处理程序发生的错误,或者 switch 语句中的每个 case 中的代码进行选择性的提取。

  3.短小精悍的方法(一般包含较少的局部变量)会让 JIT 更容易地进行寄存器选择工作,即选择哪些局部变量放在寄存器中,而不是栈上。

  4.尽量编写短小精悍的方法。


方法 类型 编译 参数 运行 两个 语法 函数 对象 分支 名称 操作符 程序 第一次 查询 选择 精悍 短小精悍 代码 原则 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南咖啡 互联网金融科技 湖北九亚互联网络科技有限公司 中关村互联网 科技集团 互联网科技工作委员会毛军 重生之互联网科技帝国 互联网科技logo设计 上海卓越科技 互联网 阿里互联网科技公司 重庆互联网医院沙龙医盟信息科技 赶超互联网科技 微信多开 未来五年的互联网科技 互联网科技数字货币 互联网风格科技公司名称 互联网高科技行业有哪些企业 广州智享互联网科技 兰石爱特工业互联网科技分公司 同城互联网络科技 10位科技互联网大佬 现代科技的标志之一的互联网 广东猪兼强互联网科技有限公司 国外互联网科技网站 金融科技和互联网金融 顶级互联网科技成果有哪些 全球顶尖互联网科技公司 燊美集互联网科技有限公司 深圳互联网科技园地址 上海互联网科技园景观 互联网 科技节活动 微视频大赛 小牛互联网科技有限公司地址
0