C#编程经验/遇到陷阱总结(一)
@TOC
前言
搞编程的,在工作中学习中,除了培养好的代码习惯、养成自己的一套代码风格,还需要多思考如何把代码写的更健壮,碰到bug如何去调试呢,与诸君共勉。
一、经验总结(未完待续…)
1.面向对象中子类向父类的转换中存在的一个陷阱
- 将子类对象引用的地址赋值给父类,此时C#规定父类引用是调用不了子类独有的方法的
1 | |
2.数据库调用存在的陷阱
- 涉及到数据库的CRUD时,不应该把DataTime.Now这个带时区的存进数据库,应该把不带时区的数据存入数据库,所以应该使用DataTime.UtcNow
3.委托使用的注意事项
- 委托跟方法调用有区别,比如calculator.Report,不能给Report方法加上(),加上()就不是委托了
4.字段的包装器。属性由 字段结合Get/Set方法对 进化而来。字段的自然扩展【咱们只用字段的话,比如age字段,定义个age=1000,这明显不符合逻辑呀,所以字段有可能会出现错误,需要依靠属性来纠正或者保证准确性】
5.针对接口编程而不是针对实现编程,可以隔离系统以后可能发生的一大堆改变
- 实现一个接口并不一定表示写一个类并实现某个接口,
实现一个接口泛指实现某个超类型(可以是类或接口)的某个方法
6.从项目中收获,存储随机生成的序列时该用Double[] NumSeries还是List NumSeries???
- 如果已经知道序列的长度,并且不需要在运行时改变序列的大小,
那么使用double[]可能更合适。double[]是一个定长的数组,它在
内存中是连续存储的,因此对于大量数据的访问和操作速度较快。
你可以通过索引直接访问数组中的元素,例如NumSeries[0]表示数组的第一个元素。 - 如果需要在运行时动态地添加、删除或修改序列的元素,那么使用List
可能更方便。List 是一个可变长度的列表,它提供了许多方便的方法来操作序列,例如Add、Remove和Insert等。虽然List 在内存中不是连续存储的,但对于一般的数据量,性能影响通常可以忽略不计。 - 综上所述,如果需要一个定长的、性能较高的序列,可以选择double[];如果需要一个可变长度的、方便操作的序列,可以选择List
。根据你的具体需求,选择适合的数据结构来存储随机生成的序列。
7.项目中嵌套LINQ查询:用于进行过滤
1 | |
8.在循环中或者其他地方追加大量字符串时【会有大量文本时】,使用StringBuilder对象
9.可以赋予局部变量推断“类型”var 而不是显式类型,也就是=右边明显能看出是啥类型或者说精度类型不重要时用var隐式类型,var 关键字并不意味着“变体”,也不表示该变量是松散类型化变量或后期绑定变量。 它只是表示由编译器确定和分配最适当的类型。
二、对代码进行拆分扩展时,遇到的报错问题:(工作中这个势必是调试bug的常规姿势,未完待续……)
- CS0122 “StepFactory.GetStep(int)”不可访问,因为它具有一定的保护级别 WindowsFormsCustomInfo D:\DevelopData\VSExercise\FreshManExercisePlan(before8.4)\WindowsFormsCustomInfo\Form1.cs 37 活动
- 解决方法:static class StepFactory{…}中的static IStep GetStep(int stepIndex){…}方法的权限修饰符由默认改为public,也就是public static IStep GetStep(int stepIndex)
- D:\DevelopData\VSExercise\FreshManExercisePlan(before8.4)\WindowsFormsCustomInfo\MyStep3.cs(36,17,36,27): error CS0103: 当前上下文中不存在名称“MessageBox”
- 解决方法:using System.Windows.Forms;VS软件自动提示的代码解决办法
- System.NullReferenceException:“未将对象引用设置到对象的实例。
Source=WindowsFormsCustomInfo StackTrace:在WindowsFormsCustomInfo.SaveFileModule.SaveFile() 在D:\DevelopData\VSExercise\FreshManExercisePlan(before8.4)\WindowsFormsCustomInfo\SaveFileModule.cs 中: 第 62 行- 根据提供的错误信息,问题出现在 SaveFileModule.cs 文件的第 62 行。错误类型是 System.NullReferenceException,意味着在该行代码中,一个对象的实例未被正确地设置。customInfo 参数没有被正确地赋值给 this.customInfo 字段。这可能导致在 SaveFile() 方法中使用 customInfo 字段时出现空引用异常。this.customInfo = infos.FirstOrDefault();使用 infos 参数的第一个元素来初始化 this.customInfo 字段。
- 解决方法:foreach (var data in info.Description)查询的目标错误,修改为:
- 类似的忽略空异常的还有:
fileContent += $”Id: {info.ID}, Description: {(string.IsNullOrEmpty(info.Description) ? “
No Description。” : info.Description)}, Data: [“;
- foreach (var data in info.NumSeries ?? Enumerable.Empty
- CS0017 程序定义了多个入口点。使用 /main (指定包含入口点的类型)进行编译。
- VS界面点击:项目–>XX属性–>应用程序 在此页有
一个启动对象属性设置成你想启动的那个类名就可以了
- VS界面点击:项目–>XX属性–>应用程序 在此页有
- CS1061 “Form1”未包含“button1_Click”的定义,并且找不到可接受第一个“Form1”类型参数的可访问扩展方法“button1_Click”(是否缺少 using 指令或程序集引用?)
- 解决办法:因为自己把Form中的button1_Click事件名字改成了Button_Click,所以Form1.Designer.cs中的Form1类的InitializeComponent()中
的代码还是this.button1.Click += new System.EventHandler(this.button1_Click);对应不上了,所以改一下Form1.Designer.cs中的Form1类的InitializeComponent()中的代码就行,把button1_Click事件名字改成Button_Click
- 解决办法:因为自己把Form中的button1_Click事件名字改成了Button_Click,所以Form1.Designer.cs中的Form1类的InitializeComponent()中
巨人的肩膀
- https://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/coding-style/coding-conventions
- 菜鸟教程
- C#高级编程
- 刘铁猛老师课程
- 公司组内的师傅们的苦口婆心的代码讲解
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.


