关于依赖注入的理解
对于依赖注入,示例流程如下: //定义接口:只规定“能启动”,不管怎么启动 //这是解耦的关键,Car 只知道接口,不知道具体实现 interface IEngine { void Start(); } // 汽油发动机:一种实现 //如果以后想切换发动机类型,只需要改注册那一行,Car 完全不用动 class Engine : IEngine { public void Start() => Console.Wr...
一篇能写完的都放在这里面 常用小知识(×) 助眠小故事(√)
对于依赖注入,示例流程如下: //定义接口:只规定“能启动”,不管怎么启动 //这是解耦的关键,Car 只知道接口,不知道具体实现 interface IEngine { void Start(); } // 汽油发动机:一种实现 //如果以后想切换发动机类型,只需要改注册那一行,Car 完全不用动 class Engine : IEngine { public void Start() => Console.Wr...
面向对象 就是把数据与操作方式放在一起,仅保留部分通道供外界调用。 直接看例子🌰 class RemoteControl { // 数据为私有,存在类里面 private int _volume = 10; // 操作公开,是操作数据的唯一入口 public void IncreaseVolume() { _volume++; Console.WriteLi...
先提关键点: 委托是把方法当参数传 事件是发生什么的时候通知我 那么好,来看委托 // 委托:定义一个方法的签名 //(签名:就是(int a, int b) 这样一个参数形式,这个形式的签名只接受(int a ,int b)形式的参数,如(1,2),其他任何形式均不接受。 //如(你好,world)、(1,hello)、(1,2,3)、(1)等均不接收) delegate int Calculate(int a, int b);...
最初的写法 // 先定义一个方法,有名字、有访问修饰符、有完整签名 bool IsEven(int n) { return n % 2 == 0; } var numbers = new List<int> { 1, 2, 3, 4, 5, 6 }; var evens = numbers.FindAll(IsEven); // 传方法名 很繁琐地写了一大堆,只为了说明要n % 2 == 0 不行啊太麻烦了,弄简单点...
古希腊掌管数据的神 这是没有Linq的时候 var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var result = new List<int>(); // 找所有偶数,乘10,从大到小排,只要前3个 foreach (int n in numbers) { if (n % 2 == 0) // 过滤...
框架总共做三件事: 1.存储:告诉框架有哪些东西 2.创建:告诉框架怎么创建东西 3.发出:有调用需求就发出 直接看例子🌰 // ServiceCollection 就是容器 var services = new ServiceCollection(); // 往里面存东西(注册) services.AddSingleton<Config>(); services.AddScoped<IUserService, UserServi...
什么是工厂方法:我不手动new,而是让一个方法去帮我new //自己动手 Config cfg = new Config("程序名称", "1.0"); // 用工厂方法 Config cfg = CreateConfig(); CreateConfig就是一个工厂方法 什么时候会需要这个东西呢 当对象的创建过程比较复杂,或者你需要控制创建逻辑时,就可以封装到一个工厂方法里。 // 创建配置类很复杂:可能有默认值、验证、从不同...
string 是不可变的,每次修改都是在内存里创建一个全新的字符串对象。 string s = "Hello"; s = s + " World"; // 没有修改原来的"Hello",而是创建了一个新的"Hello World" 原来的 "Hello" 还在内存里,只是没人用了,等垃圾回收器来收。 少量拼接无所谓,循环里大量拼接就会出性能问题。 string result = ""; for (int i = 0; i <...
?. 叫空值传播运算符,对象是 null 时直接返回 null,不报空引用异常。 string name = person?.Name; // person为null时,返回null,不报错 // 等价于: // if (person == null) return null; // else return person.Name; //(以前不懂,猛写if else) 还能链式用:person?.Address?.City,中间...
nameof 在编译时把类名、方法名、属性名转成字符串。 Console.WriteLine(nameof(Person.Name)); // 输出 "Name" 改名字时字符串自动跟着变,不像硬编码的 "Name" 那样变成过时的死字符串。 最常用的场景是抛异常时传参数名。 void SetName(string name) { if (name == null) throw new ArgumentNu...
out 让方法通过参数往外输出一个值。 void TryParse(string input, out int result) { result = int.Parse(input); } TryParse("123", out int number); Console.WriteLine(number); // 123 调用方用 out 标记的变量不需要预先赋值,方法里必须给它赋值。 ref 让你把变量传进方法,方法可...
List<T> 是 C# 里最常用的集合类型,用来装一组相同类型的数据。 数组长度固定,List 可以随便加随便删,不用提前指定大小。 var names = new List<string>(); // 空列表 var nums = new List<int> { 1, 2, 3 }; // 带初始值 T 是泛型占位符,List<string> 就是装字符串的列表,List<int> 就是装整数的列表。一个...
拖拽预览区域调整图片位置,滑杆可缩放,确认后将上传并应用。
请输入关键词开始搜索。