分类 E神课程记录 下的文章

lambda匿名函数,var匿名类,扩展方法,迭代器yieid,Linq


lambda 是一个方法
C#1.0

NoReturnNoPara method =new NoReturnNoPara(this.DoNoting);

C#2.0

NoReturnNoPara method = new NoReturnNoPara(delegate(){});

C#3.0 lambda :左边是参数列表 gose to 右边是方法体 可以省略参数类型 自动推算的

NoReturnNoPara method = new NoReturnNoPara(()=>{});
NoReturnWithPara method = new NoReturnWithPara((int x,int y)=>{});
NoReturnWithPara method = new NoReturnWithPara((x,y)=>{});
NoReturnWithPara method = (x,y)=>{};

匿名类

Student student = new Student(){id=1,age=2};
Object Object = new{id=1,age=2}; //Object不能直接.id 编译器不允许  可以用反射,dynamic,var来实现获取值
dynamic dmodel= new{id=1,age=2}; //dynamic 会避开编译的检查
var varmodel = new{id=1,age=2};//编译后是有一个真实的类  里面的属性是只读的 不能赋值
var确定类型后是不能改类型的

扩展方法 C#3.0 静态类里面的静态方法,第一个参数类型前面加上this
扩展方法可以用泛型
用途:又要增加方法,又不想(不能)修改类;也就是方便一点
缺点:优先调用类型的实例方法(如果我们自己添加了一个扩展方法,未来别人给这个类添加了这个方法,就有问题了)
注意:扩展基类型,会导致任何子类都有这个方法,而且还可能被覆盖啥的;重复扩张方法 便宜无错 调用的地方报错 二重义
建议:指定类型扩展 越细节越好 不要对基类型,否则对成本太高

public static class ExtendMethod
{
    public static void Sing(this Student student)
    {
          
    }

}
Student student = new Student();
student.Sing(); //即可

Linq To object(Enumerable)
where:完成对数据集合的过滤,通过委托封装完成通用代码,泛型+迭代器起提取特性
select:完成对数据集合的转换,通过委托封装完成通用代码,泛型+迭代器起提取特性(投影)

Linq To sql (Queryable) SQL+ADO.NET
where:完成对数据库的过滤,封装了通用代码AOD.NET,通过表达式目录树解析sql
System.Linq.Expressions.Expression 表达式目录树

Linq To Xml 封装对XML的操作
Linq To Everything!!!

Linq To object
List<Student> list = new List<Student>();
var resulot =  list.Where(s=>s.Age<30); //陈述试语法
public static class ExtendMethod
{
    public static List<T> Where<T>(this List<T>  source,Func<T,bool> func)
    {
        var list = new List<T>();
        foreach(var item in source)
        {
            if(func.Invoke(item))
            {
                list.Add(item);
            }
        }
        return list;
    }
}

迭代器yieid 按需加载 Ienumerable Ienumerable 与 yieid 天生一对 相辅相成

from s in studentlist where s.Age < 30 select s; //查询表达式

查询表达式会转换成陈述试语法


IO/序列化/反序列化


ConfigurationManager.AppSettings["key"] 获取配置文件
static 关键字 静态 会在第一次访问类的时候 初始化所有的属性跟字段 只会初始化一次
所有关于配置静态属性 字段放一个类里面 集中管理(推荐)

序列化 反序列化 可以实现深拷贝
对象---序列化---》字符串---反序列化---》对象

Json 二进制 Soap Xml

二进制最小 方便传输
Soap是最大的 最麻烦 里面有好多额外的信息
Xml 适合阅读 方便书写
Json 适合阅读 json比xml体积小 Json格式需要数据严整 否则会失效

AppDomain.CurrentDomain.BaseDirectory;(获取当当前程序路径)
Directory.Exists("path") 检查文件夹是否存在
DirectoryInfo directory = new DirectoryInfo("path");//文件夹不存在不会报错
File.Exists("path") 检查文件是否存在
Path.Combine("path1","path2") 拼接路径
DirectoryInfo directory = Directory.CreateDirectory(LogPath); //一次性创建全部的子路径
Directory.Move(oldpath,newpath)//移动文件夹
Directory.Delete(path)//删除文件夹
创建文件 需要文件夹是存在的 否则会异常
FileStream fileStream= File.Create(filepath) //覆盖
StreamWriter sw = new StreamWriter(fileStream); //覆盖
StreanWriter sw = File.AppendText(fileName); 打开追加
File.ReadAllLines(fileName) //一次读成集合
File.ReadAllText(fileName) //一次读成文本
File.ReadAllBytes(fileNmae)//一次读成Bytes
File.Copy(oldpath,newpath) //把文件复制到别的路径
File.Move(oldpath,newpath) //把文件移动到别的路径
File.Delete(oldpath) //把文件删除文件 尽量不要delete


异步,多线程


进程:一个程序在计算机上运行的时候,占用的全部计算资源,称之为进程
线程:任何操作的执行,都是线程完成的 最小的执行流
线程属于进程 一个进程可以有多个线程
多线程:多个线程同时运行(多个执行流并发执行)

同步:完成方法调用后,才进入下一行
异步:发起方法调用,但是不等待,直接进入下一行,这个方法会执行的

1 同步方法卡界面,主线程忙于计算;异步多线程方法不卡界面,主线程闲置了,子线程在计算
2 同步方法慢,只有一个线程计算;异步多线程方法快,因为多线程并发计算;

   但不是线性增长,资源换时间,资源是有限的;多线程调度管理也有损耗

加快相应速度可以用多线程;但是线程不是越多越好;
3 异步多线程是无序的
启动无序:线程是OS 申请看运气
执行无序:互不干扰 看CPU调度
结束无序:耗时不确定
使用多线程一定要注意:不要想当然的去控制顺序,不要延迟启动来控制顺序
这些无序都会受到服务器状态影响

回调/状态通知/循环等待 控制顺序

请二哈吃饭,诚心诚意,他说要忙一会,我就等着,一直等他忙完了,咱们一起去吃饭
请Doing吃饭,客气一下,他说要忙一会,那我就自己去吃饭了,你忙完了你自己去吃饭吧

Thread
委托:Action(没返回值) Func(有返回值的)

Aciton action = new Action(要调用方法);
action.Invoke();//同步执行
action.BeginInvoke();//异步执行


2018-05-17 Task
.net 1.0 1.1

Thread thread = new Thread(new ThreadStart(()=>{}));
thread.Start();

.net 2.0 线程池 管理线程,限制最大线程数量;享元模式 做好线程的重用

ThreadPool QueueUserWorkItem(new WaitCallback(o=>{}));

.net 3.0 Task 基于线程池的;提供了丰富的api

Task.Run(new Action(()=>{}));

.net 3.5 TaskFactory

TaskFactory taskFactory = Task.Factory;
List<Task> taskList = new List<Task>();
taskList.Add(taskFactory.StatNew(new Action(()=>this.Coding("Name1","Client")));
taskList.Add(taskFactory.StatNew(new Action(()=>this.Coding("Name2","WechaClient"))));
taskList.Add(taskFactory.StatNew(new Action(()=>this.Coding("Name3","DBA"))));
Task.WaitAll(taskList.ToArray()); //表示线程等待全部task的完成
Task.WaitAny(taskList.ToArray()); //任意一个完成之后
Action<Task[]> action = new Action<Task[]>(tArray=>Console.WriteLine("联调测试"));
taskFactory.ContinueWhenAll(taskList.ToArray(),action);//等着等着任意任务完成后,启动子线程完成
Action<Task> action1 = new Action<Task>(t=>Console.WriteLine("红包奖励"));
taskFactory.ContinueWhenAny(taskList.ToArray(),action1);//等着任意任务完成后,启动子线程完成  回调式 参数是执行完的那个线程

.net 4.0 Parallel 并行计算

Parallel.Invoke(new Action(()=>{}));

问:线程池跟多线程的区别
答:多线程是在程序里多个线程,线程池可以管理线程,限制最大线程数量;享元模式 做好线程的重用

问:有没有一个结束让其他线程结束(节省资源的方法) 线程取消
答:1.线程自己支持 设置一个状态做判断 2.没有开始的线程没有取消 CTS

问:TaskFactory的线程个数可以设置吗
答:不能直接设置 可以设置ThreadPool


Redis


Nosql 非关系型数据库 为了web2.0

Redis 单线程的

serviceStack.Redis ado.net
Redis数据结构
String
HashTable
Set 特点:可以自动去重 排序 交集(共同好友) 差集 并集 随机找一个 随机删除一个
ZSet 比set多一个 排序 权重 性能比较差 可以做排行榜
List 先进先出 实时异步队列


事件 委托


委托&事件: 可以把一堆可变的动作/行为封装出去,交给第三方来制定

public delegate void Delegate();
public Delegate DelegateHander;
public Event Delegate EventDelegateHander;
Event关键字 可以限制变量被外部调用/直接赋值

DelegateHander() == DelegateHander.Invoke() 调用实例
DelegateHander.BeginInvoke(callback,object) 异步调用

多播委托:一个变量保存多个方法,可以增减;invoke的时候可以按顺序执行
+= 为委托实例按顺序增加方法,形成方法链,Invoke时,按顺序依次执行
-= 为委托实例移除方法,从方法链的尾部开始匹配,遇到第一个完全吻合的,移除且只移除一个,没有也不异常
多播委托是不能异步的不支持beginInvoke()

委托和事件的区别和联系
委托: 是一个类型
事件: 是委托类型的一个实例

程序设计的时候,我们可以把程序分成俩部分 一部分是固定的,直接写死;还有不固定的地方,通过一个事件去开放接口,外部可以随意扩展动作

框架:完成固定/通用部分,把可变部分留出扩展点,支持自定义