C#基础进阶
观看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#基础进阶的更多相关文章
- 【简单易懂的AMV图文教程-2】VEGAS基础进阶——认识关键帧
[简单易懂的AMV图文教程-2]VEGAS基础进阶--认识关键帧 经过了上一期VEGAS基础教程的学习,相信大家都能独立完成一些比较简单的纯剪辑作品了.今天在这里为大家继续介绍VEGAS的一大基础应用 ...
- 老王Python培训视频教程(价值500元)【基础进阶项目篇 – 完整版】
老王Python培训视频教程(价值500元)[基础进阶项目篇 – 完整版] 教学大纲python基础篇1-25课时1.虚拟机安装ubuntu开发环境,第一个程序:hello python! (配置开发 ...
- js基础进阶--关于setTimeout的思考
欢迎访问我的个人博客:http://www.xiaolongwu.cn 先热身 看看下面的额代码会打印出什么? for (var i = 0; i < 5; i++) { setTimeout( ...
- js基础进阶--图片上传时实现本地预览功能的原理
欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 最近在项目上加一个图片裁剪上传的功能,用的是cropper插件,注意到选择本地图片后就会有预览效果,这里整理一下这种预览效 ...
- 第二十八节:Java基础-进阶继承,抽象类,接口
前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...
- python最全学习资料:python基础进阶+人工智能+机器学习+神经网络(包括黑马程序员2017年12月python视频(百度云链接))
首先用数据说话,看看资料大小,达到675G 承诺:真实资料.不加密,获取资料请加QQ:122317653 包含内容:1.python基础+进阶+应用项目实战 2.神经网络算法+python应用 3.人 ...
- 前端基础进阶(五):全方位解读this
https://segmentfault.com/a/1190000012646488 https://yangbo5207.github.io/wutongluo/ 说明:此处只是记录阅读前端基础 ...
- python学习大全:python基础进阶+人工智能+机器学习+神经网络
首先用数据说话,看看资料大小,达到675G承诺:真实资料.不加密.(鉴于太多朋友加我QQ,我无法及时回复,) 方便的朋友给我点赞.评论下,谢谢!(内容较大,多次保存) [hide]链接:[url]ht ...
- Mybatis基础进阶学习2
Mybatis基础进阶学习2 1.测试基本结构 2.三个POJO package com.pojo; import java.io.Serializable; import java.util.Dat ...
- 学习python须知,Python基础进阶需掌握哪些知识点?
Python基础进阶需要掌握哪些知识点?Python将是每个程序员的标配,有编程基础再掌握Python语言对于日后的升职加薪更有利.Python语言简洁利于理解,语法上相对容易能够让开发者更专注于业务 ...
随机推荐
- 1031: [编程入门]自定义函数之字符串反转(python)
问题 1031: [编程入门]自定义函数之字符串反转 时间限制: 1Sec 内存限制: 128MB 提交: 7225 解决: 3331 题目描述 写一函数,使输入的一个字符串按反序存放,在主函数中输入 ...
- BUGKU (Take the maze)
首先进行查壳,没有壳. 随便输入,看程序执行信息.随意输入字符串,提示key error 放到IDA中打开,在左侧函数窗口中找到main0,F5反编译,进行分析.具体已在分析在图中标识. 关于main ...
- python利用smtp发送邮件
#!/usr/bin/env python # -*- encoding: utf-8 -*- # author:IversOn5 import requests import json import ...
- java 数组学习
遍历数组 --- for和foreach int[][] A = {{2,4},{3,5}}; int i = 0; for (int[] is : A) { i++; int j = 0; for ...
- dll的封装和使用
背景 在windows平台下,要实现函数的封装,一般采用的是dll动态库的形式 实现了函数的封装就意味着实现过程的隐藏 可以实现跨平台和跨语言的使用 实施步骤 生成dll动态库 在VS中生成新项目,应 ...
- python 爬虫 基于requests模块发起ajax的get请求
基于requests模块发起ajax的get请求 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 用抓包工具捉取 使用ajax加载页面的请求 鼠标往下 ...
- Oracle密码过期(the password has expired)
1.进入sqlplus模式--sqlplus / as sysdba; 2.查看用户密码的有效期设置(一般默认的配置文件是DEFAULT) SELECT * FROM dba_profiles WHE ...
- JS小知识--获取当前日期的时间和上周五时间
获取当前日期的时间和上周五时间 var today=new Date();//获取当前时间var weekday=today.getDay();//获取星期几 var monday=new Da ...
- [转帖].MegaRAID SAS 9361-8i 开箱 极简测试
[配件开箱] 谁说raid0软硬没多大区别的...MegaRAID SAS 9361-8i 开箱 极简测试 [复制链接] https://www.chiphell.com/thread-1810952 ...
- [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)
[BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...