观看C#高级教程进行学习。巩固基础,进阶学习。

1.委托

把方法当做参数来传递就是委托。委托的关键字是delegate。

 class Program
{
private delegate string GetString();
static void Main(string[] args)
{
int x=;
GetString a = x.ToString;//方法签名
string t = a();
Console.WriteLine("{0}", t);
Console.ReadKey();
}
}

委托获取X的String

Invoke方法也可以调用委托所引用的方法。a.Invoke();

Action委托 无返回值 void返回类型

       static void Print()
{
Console.WriteLine("www"); }
static void Main(string[] args)
{
int x=;
Action a = Print;//Action是系统内置的一个委托类型,指向一个没有返回类型,没有参数的方法
a.Invoke();
Console.ReadKey();
}

Action委托

      static void Print(int x)
{
Console.WriteLine("www"); }
static void Main(string[] args)
{
int x=;
//Action a = Print;//Action是系统内置的一个委托类型,指向一个没有返回类型,没有参数的方法
Action<int> a = Print;//定义一个委托类型,指向一个没有返回值,有一个int参数的方法。
a.Invoke(x);
Console.ReadKey();
}

Action

多个参数也是可以的。Action<T,T,T> 最多可以16个参数。

Func委托

static int Print ()
{
return ;
} static int test(string str)
{
Console.WriteLine(str);
return ;
} static void Main(string[] args)
{ Func<int> a = Print;//泛型指定的是方法的返回值类型
Func<string, int> b = test;//Func后面可以跟很多类型,最后一个类型是返回类型,前面都是参数类型,参数类型必须和方法参数对应。
//返回值类型必须有一个。
Console.WriteLine(a());
b("");
Console.ReadKey();
}

Func委托

Func委托依然支持16个参数,但必须有返回类型值。多个参数时,返回类型写最后一个。

Action理解为动作委托,执行,可加参数。Func比较全面。

这两种方法不需要自己定义,直接用就好了,比较方便。

多播委托->使用+=来进行追加委托引用。

Func<int, int, int> a = delegate(int add1, int add2)
{
return add1 + add2;
};//匿名方法本质是一个方法,任何使用委托的地方都可以使用匿名方法。

匿名方法

 Func<int, int, int> plus = (add1, add2) =>//Lambda参数不需要声明类型
{ return add1 + add2;
};
Console.WriteLine(plus(, ));
Console.ReadKey();

Lambda表达式

Lambda表达式可以代替匿名方法。

2.事件

事件是受限制的委托。public event delegate Mydelegate;

3.LINQ查询

ModelInfo model = (from l in listModels
where l.modelName == strModelFunc && l.modelId == strModelID && l.line == strLine && strStation == l.station
select new ModelInfo
{
sid = l.sid,
modelName = l.modelName,
line = l.line,
csname = l.csname,
factory = l.factory,
modelId = l.modelId,
station = l.station
}).FirstOrDefault();

LINQ NEW对象

背景一个名字 功夫 等级表 一个功夫名和伤害表

var res= from m in List//from 设置查询的集合
where m.Level>
select m;//选中m 也可以是m中的属性

LINQ查询

var res=list.where(a=>a.level>)

扩展方法写法

var res= from m in alist
from n in blist
while m.kongfu=n.name &&n.power>//连接限制条件 功夫名字相等,杀伤力大于90
select m //获取人物(伤害大于90)
select new{master=m,kongfu=k}//获取全部的数据(在限制条件下)

LINQ联合查询

select最后选择的是获取什么数据

排序 orderby 降序 descending

多个字段排序 orderby m.level ,m.age //当第一个字段相同,按第二个来。

var res=from m in alist
join k in blist on m.kongfu equals k.Name
where k.power>
select new {master=m,kongfu =k};//两表连接

LINQ JOIN ON

方法写法有SKIP 跳页 ,两种写法可以混合使用。

4.反射和特性

程序及其类型的数据称为元数据。

查看本身或其他程序集的元数据的行为就叫反射。

 MyClass myclass = new MyClass();
Type type=myclass.GetType();//获取类的type对象
Console.WriteLine(type.Name);//获取类名
Console.WriteLine(type.Namespace);//获取命名空间
Console.WriteLine(type.Assembly);//获取集合类
FieldInfo[] array=type.GetFields();//只能获取共有字段
foreach (var m in array)
{
Console.WriteLine(m.Name);
}
PropertyInfo[] array2 = type.GetProperties();//获取属性
foreach (var n in array2)
{
Console.WriteLine(n.Name);
}
MethodInfo[] array3 = type.GetMethods();//获取方法
foreach (var k in array3)
{
Console.WriteLine(k.Name);
}
Console.ReadKey();

Type对象

 MyClass myclass = new MyClass();
Assembly assem = myclass.GetType().Assembly;//通过类的type对象获取所在程序集Assembly
Console.WriteLine(assem.FullName);
Type[] type=assem.GetTypes();
foreach (var k in type)
{
Console.WriteLine(k.Name);
}
Console.ReadKey();

Assembly对象

特性:向程序的程序集增加元数据的语言结构。

[Obsolete("该方法弃用",false)]//表示该方法已经弃用,第一个参数表示给予的提示信息,第二个参数表示是否显示错误,true会报错,false会提示警告.
static void OldMethod() { }

Obsalete特性

#define IsTest//定义一个宏
[Conditional("IsTest")]
static void OldMethod()
{
Console.WriteLine(""); }
//在引用前面定义宏,使用Conditional特性,如果不需要使用该方法,注释宏定义即可。

Conditional特性

5.进程和线程

进程理解为一个应用程序,线程理解为应用程序下的任务。

Action a=Test;//委托a指向方法Test()
a.BeginInvoke(null,null);//开启线程去执行

异步委托BeginInvoke

Func<int,string,int> a= Test;
IAsyncResult ar=a.BeginInvoke(,“sky”,OnCallBack,a);
//倒数第二个参数表示一个委托类型的参数,表示回调函数,如果没有回调可以写Null,回调函数就是异步结束了会去调用这个委托指向的方法,倒数第一个参数表示用来给回调函数传递数据。
static void OnCallBack(IAsyncResult ar)
{
Func<int,string,int> a=ar.AsncState as Func<int,string,int>;
int res=a.EndInvoke(ar);
}

回调函数

线程

static void DownloadFile()//无参
{
}
Thread t= new Thread(DownloadFile);//创建Thread对象,但没有启动
t.Start()//启动 static void DownloadFile(object Filename)//带参数,只能是objec对象
{
}
Thread t= new Thread(DownloadFile);//创建Thread对象,但没有启动
t.Start("")//启动 参数在start中传入

Thread

前台线程和后台线程

前台线程,前台线程当Main方法结束了,依然在运行,直到前台线程完成其任务为止。

后台线程,当Main结束了,后台线程随之结束。

IsBackgroud设置。

线程池

 static void ThreadMethod(object state)//线程池调用的方法默认带有Object参数
{
Console.WriteLine("线程开始"+Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
Console.WriteLine("线程结束");
}
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(ThreadMethod);//开启一个工作线程 线程池默认是后台线程 不能修改为前台线程 只能用于比较短的线程
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
Console.ReadKey(); }//多个线程的情况,例如第一秒跑第一个 第二秒跑第二个

线程池

C#基础进阶的更多相关文章

  1. 【简单易懂的AMV图文教程-2】VEGAS基础进阶——认识关键帧

    [简单易懂的AMV图文教程-2]VEGAS基础进阶--认识关键帧 经过了上一期VEGAS基础教程的学习,相信大家都能独立完成一些比较简单的纯剪辑作品了.今天在这里为大家继续介绍VEGAS的一大基础应用 ...

  2. 老王Python培训视频教程(价值500元)【基础进阶项目篇 – 完整版】

    老王Python培训视频教程(价值500元)[基础进阶项目篇 – 完整版] 教学大纲python基础篇1-25课时1.虚拟机安装ubuntu开发环境,第一个程序:hello python! (配置开发 ...

  3. js基础进阶--关于setTimeout的思考

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 先热身 看看下面的额代码会打印出什么? for (var i = 0; i < 5; i++) { setTimeout( ...

  4. js基础进阶--图片上传时实现本地预览功能的原理

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 最近在项目上加一个图片裁剪上传的功能,用的是cropper插件,注意到选择本地图片后就会有预览效果,这里整理一下这种预览效 ...

  5. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...

  6. python最全学习资料:python基础进阶+人工智能+机器学习+神经网络(包括黑马程序员2017年12月python视频(百度云链接))

    首先用数据说话,看看资料大小,达到675G 承诺:真实资料.不加密,获取资料请加QQ:122317653 包含内容:1.python基础+进阶+应用项目实战 2.神经网络算法+python应用 3.人 ...

  7. 前端基础进阶(五):全方位解读this

    https://segmentfault.com/a/1190000012646488  https://yangbo5207.github.io/wutongluo/ 说明:此处只是记录阅读前端基础 ...

  8. python学习大全:python基础进阶+人工智能+机器学习+神经网络

    首先用数据说话,看看资料大小,达到675G承诺:真实资料.不加密.(鉴于太多朋友加我QQ,我无法及时回复,) 方便的朋友给我点赞.评论下,谢谢!(内容较大,多次保存) [hide]链接:[url]ht ...

  9. Mybatis基础进阶学习2

    Mybatis基础进阶学习2 1.测试基本结构 2.三个POJO package com.pojo; import java.io.Serializable; import java.util.Dat ...

  10. 学习python须知,Python基础进阶需掌握哪些知识点?

    Python基础进阶需要掌握哪些知识点?Python将是每个程序员的标配,有编程基础再掌握Python语言对于日后的升职加薪更有利.Python语言简洁利于理解,语法上相对容易能够让开发者更专注于业务 ...

随机推荐

  1. 【转】Apache HBase 问题排查思路

    [From]https://www.itcodemonkey.com/article/9426.html HBCK - HBCK检查什么? (1)HBase Region一致性 集群中所有region ...

  2. Java ——类型转换 向args传递参数

    本节重点思维导图  自动类型转换 整型.实型(常量).字符型数据可以混合运算 运算中,不同类型的数据先转化为同一类型,然后进行运算 转换从低级到高级 低 ----------------------- ...

  3. python-Web-django-图形验证

    import random def get_random_color(): return (random.randint(0, 255), random.randint(0, 255), random ...

  4. Django-给视图加装饰器

    给FBV加装饰器 FBV:function based view FBV本身就是一个函数,所以跟普通函数加装饰器是一样的 # 装饰函数是要在APP文件中定义,本例是在app01\templatetag ...

  5. C++学习笔记-构造函数和析构函数

    构造函数和析构函数是C++的重要组成部分,了解构造函数和析构函数有助于深入了解C++ 构造函数 构造函数产生的原因 在C++中,有时候需要在对象创建的时候初始化数据,如果采用普通函数的话,每次初始化都 ...

  6. Push failed: Failed with error: Could not read from remote repository. IDEA 解决方法

  7. PTA(Advanced Level)1011.World Cup Betting

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  8. PTA(Basic Level)1053.住房空置率

    在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断.判断方法如下: 在观察期内,若存在超过一半的日子用电量低于某给定的阈值 e,则该住房为"可能空置&quo ...

  9. ABC136E Max GCD

    Thinking about different ways of thinking. --- LzyRapx 题目 思路比较容易想到. Observations: 每次操作过后和不变. 枚举和的因子 ...

  10. Django 模版语法与使用

    目录 Django 模版语法与使用 django模板语言介绍 (摘自官方文档) 链接 什么是模板? 模板语句的 注释 变量 {{ 变量 }} 点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值 ...