分类和目录
- C#
- JavaScript
- database
IOC、DI,IoC容器
依赖倒置原则(DIP)一种软件架构设计的原则(抽象概念)。
设计原则只提供软件设计的准则和指南,不会提供解决方案。以便设计好的软件,避免不良的设计。设计模式是一些课重用的解决方案,它解决一些实际的问题。比如工厂模式、单例模式等等。
控制反转(Ioc)一种反转流、依赖和接口的方式(DIP的具体实现方式)。
依赖注入(DI)IoC的一种实现方式,用来反转依赖(IoC的具体实现方式),它将需要依赖(低层模块)对象的引用传给被依赖(高层模块)对象,实现的方式有构造函数注入、属性注入、接口注入等。
IoC容器依赖注入的框架,用来映射依赖,管理对象创建和生存周期(DI框架);动态创建、注入依赖对象;管理对象生命周期;映射依赖关系。
依赖倒置原则转换了依赖,高层模块不依赖于底层模块的实现,而底层模块依赖于高层模块定义的接口。通俗的讲,就是高层模块定义接口,底层模块负责实现。
高层模块不应依赖于低层模块,两者应该依赖于抽象。抽象不应该依赖于实现,实现应该依赖于抽象。
控制反转(IoC),它为相互依赖的组件提供抽象,将依赖(低层模块)对象的获取交给第三方来控制,即依赖对象不在被依赖模块的类中通过new来获取。
async和await异步编程
通过使用异步编程,你可以避免性能瓶颈并增强应用程序的总体响应能力。 但是,编写异步应用程序的传统技术可能比较复杂,使它们难以编写、调试和维护。
使用 async/await 功能可以更轻松直观地编写异步程序。 你可以
编写类似于同步代码的异步代码,并让编译器处理异步代码通常需要的疑难回调函数和延续。
UI线程由于所有与用户界面相关的活动通常共享一个线程,因此,异步对访问 UI 线程的应用程序来说尤为重要。
命名约定将“Async”追加到包含 async 修饰符的方法的名称后,方法内通常包含至少一个await表达式,
该表达式标记一个点,在该点上,直到等待的异步操作完成方法才能继续。 同时,将方法挂起,并且控制返回到方法的调用方。
返回类型Task或Task<TResult>。
线程
异步方法旨在成为非阻止操作。 异步方法中的await表达式在等待的任务正在运行时不会阻止当前线程。 相反,表达式在继续时注册方法的其余部分并将控制返回到异步方法的调用方。
async
和await关键字不会创建其他线程(可以理解为工作的异步抽象,而非在线程之上的抽象);任务运行时,使用await在任务完成前将控制让步于其调用方,可让应用程序和服务执行有用工作。 任务完成后代码无需依靠回调或事件便可继续执行。
特点等待I/O请求返回的同时,可通过生成处理更多请求的线程,处理更多的服务器请求;等待I/O请求的同时生成 UI 交互线程,并通过将长时间运行的工作转换到其他 CPU 核心,让 UI 的响应速度更快。
服务器
此模型可很好地处理典型的服务器方案工作负荷。 由于没有专用于阻止未完成任务的线程,服务器线程池可服务更多的 Web 请求。
客户端对客户端应用带来的最大好处在于提高了响应能力。
委托
委托的发展
在 C# 1.0 中,通过使用在代码中其他位置定义的方法显式初始化委托来创建委托的实例。 C# 2.0 引入了匿名方法的概念,作为一种编写可在委托调用中执行的未命名内联语句块的方式。 C# 3.0 引入了 lambda 表达式,这种表达式与匿名方法的概念类似,但更具表现力并且更简练。
概念委托是一种类型,属于引用类型,委托的关键字是delegate,委托的定义和类的定义一样,所以能定义类的地方都可以定义委托;委托不仅能够调用实例方法,也能调用静态方法
声明委托[修饰符] delegate <函数返回类型> <委托名> (<函数参数>)
匿名委托由于使用匿名方法无需创建单独的方法,因此可减少对委托进行实例化的编码开销
实例化委托<委托类型> <实例化名>=new <委托类型>(<注册函数>) 或 <委托类型> <实例化名>=<注册函数>
类型安全所谓类型安全,是指编译器在编译时就能确定委托的参数类型和返回值类型


1 class Program 2 { 3 //定义委托 4 public delegate void myDelegate(); 5 static void Main(string[] args) 6 { 7 //实例化委托,并为委托指定一个执行方法(该方法的返回值必须和委托返回值一致) 8 myDelegate printDelegate = new myDelegate(printInfo); 9 //执行委托指定的方法 10 printDelegate(); //printDelegate.Invoke(); 11 Console.ReadLine(); 12 } 13 public static void printInfo() 14 { 15 Console.Write("123"); 16 } 17 }
语法糖通过Lambda表达式实现(C#3.0中引入),也是匿名委托


1 class Program 2 { 3 //定义委托(无参数无返回值) 4 public delegate void myDelegate1(); 5 //定义委托(有参数无返回值) 6 public delegate void myDelegate2(string msg); 7 //定义委托(有参数有返回值) 8 public delegate string myDelegate3(string msg); 9 static void Main(string[] args) 10 { 11 myDelegate1 delegate1 = () => Console.WriteLine("无参数无返回值"); 12 delegate1(); 13 myDelegate2 delegate2 = p => Console.WriteLine(p); 14 delegate2("有参数无返回值"); 15 myDelegate3 delegate3 = p => p;//或者‘块’代码{ return p; } 16 Console.WriteLine(delegate3("有参数有返回值")); 17 Console.ReadLine(); 18 } 19 }
匿名委托传参只有一个参数时,只需一个变量即可;没有参数或多个参数应放在小括号中(没有参数则小括号内为空)(Lambda表达式)
委托和Lambda1、Lambda 包含的参数数量必须与委托类型包含的参数数量相同;2、Lambda 中的每个输入参数必须都能够隐式转换为其对应的委托参数;3、Lambda 的返回值(如果有)必须能够隐式转换为委托的返回类型
逆变父类转换为子类(允许方法的参数是委托签名中对应位置上参数的基类)
协变子类转换为父类(允许方法的返回类型是委托签名中定义的返回类型的继承类)
委托多播性<委托类型> <实例化名>+[或-]=new <委托类型>(<注册函数>) 或 <委托类型> <实例化名>+[或-]=<注册函数>
锁
概念test info
C#关键字
constconst关键字用来声明某个常量字段或常亮局部变量,常量字段或常亮局部变量
不是变量且不能修改,只能在声明字段时赋值,是编译时常量(
常量或类型声明是隐式的静态成员)。
readonlyreadonly关键字用来声明某个常量字段或常亮局部变量;可以在声明、实例构造函数、静态构造函数中赋值,是运行时常量,值取决于构造函数。
staticstatic关键字用来声明属于类型本身而不是属于特定对象的静态成员,尽管类的实例包含该类的所有实例字段的单独副本,但
每个静态字段只有一个副本。
static readonly在构造函数初始化,初始化后值不可以再改变。
运算符
位移运算符
x << y(左移),x >> y(右移)
类型运算符x is T(如果x为T返回true,否则返回false),x as T(如果x是T返回x,否则返回null)
逻辑运算符
x & y(整型按位“与”,布尔型逻辑“与”),x | y(整型按位“或”,布尔型逻辑“或”),x ^ y(整型按位 XOR,布尔型逻辑 XOR)
条件运算符
x && y(仅当 x 为 True 时计算 y),x || y(仅当 x 为 False 时计算 y)
null运算符x ?? y(如果 x 为 Null,则计算结果为 y,否则计算结果为 x),
x ? y : z(如果 x 为 True,则计算结果为 y;如果 x 为 False 则计算结果为 z)
匿名函数和Lambda表达式
表现形式Lambda表达式和匿名方法
匿名函数没有名称的函数
Lambda表达式需要在 Lambda 运算符=>左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块((input-parameters) => expression);LINQ中经常使用Lambda表达式
二进制、八进制、十进制、十六进制
二进制加法法则0 + 0 = 0,0 + 1 = 1 ,1 + 0 = 1, 1 + 1 = 10(向高位进位)。
二进制减法法则0 - 0 = 0,0 - 1 = 1(向高位借位) ,1 - 0 = 1,1 - 1 = 0。
二进制乘法法则0 * 0 = 0, 0 * 1 = 0,1 * 0 = 0,1 * 1 = 1。
二进制除法法则0 ÷ 0 = 0,0 ÷ 1 = 0,1 ÷ 0 = 0 (无意义),1 ÷ 1 = 1。
权“权”就是进制的基底(进制)的n次幂。如二进制的权就是2的n次幂了(2)*n,十进制的权就是10的n次幂(10)*n。
二进制转十进制基数乘以权,然后相加;小数部分也一样。如10010=(0*2的零次幂)+(1*2的1次幂)+(0*2的2次幂)+(0*2的3次幂)+(1*2的4次幂)=0+2+0+0+16=18,所以10010的十进制是18。
十进制转二进制1、整数部分:采用连续
除基取余,
逆序排列法,直至商为0,如9,9/2=4余
1 4/2=2余
0 2/2=1余
0 1/2=0余
1,所以9的二进制是
1001;或估算(适用于数值较小的十进制),也是二进制转十进制的逆向算法;首先算出二进制的位数(2的n次幂等于这个十进制数则n+1就是二进制的位数,如果这个数略小于2的n次幂,则位数就是n(大于不加));如果这个数刚好是2的n次幂,那么这个数对应的二进制就是最高位(最左边)是1,其余位数补0即可(如8是2的3次幂,对应的二进制就是1000,7小于8,7对应的二进制位数是3位,二进制是7=8-1=1000-0001=0111或7=1+2+4=001+010+100=111,9的二进制=9=8+1=1000+0001=1001);
2、小数部分:采用连续
乘基(即2)取整,
顺序排列法,如(0.8125)10=(0.1101)2。步骤:0.8125*2=
1.625,0.625*2=
1.25,0.25*2=
0.5,0.5*2=
1.0,则正向取整得(0.
1101)2。
八进制转二进制把每一位八进制数对应转换为一个三位二进制数。如(745.361)8= (111 100 101.011 110 001)2。
十六进制转二进制把每一位十六进制数对应转换为一个四位二进制数。如(
9
A
F)16=(
1001
1010
1111)2。
消息队列MQ
概念test info
模版内容
索引
概念test info
模版内容
脏数据、幻读
概念test info
模版内容
模版标题
概念test info
模版内容
到底了