C#自学——委托、LINQ(c#中委托)
myzbx 2025-07-21 16:29 3 浏览
委托的概念
委托是一种可以指向方法的数据类型(委托类型),可以声明委托类型的变量
数据类型指的是类似类的,前面提到过一切皆对象,委托就是将方法当作对象使用
声明委托
delegate 返回值类型 委托类型名称(参数);
创建委托
委托类型 变量 = new 委托类型(方法);
注:方法的参数必须与委托类型的参数一致,方法后面不需要括号,方法后面加括号是调用
简化创建委托
创建委托可以不使用new关键词
委托类型 变量 = 方法;
注:方法后面不可以加括号
注:委托是引用类型,可以为null,如果调用会抛出 NullReferenceException(空引用异常)
使用无返回值的委托
直接代码展示
class MainClass
{
public static void Main(string[] args)
{
MyDelegate del = new MyDelegate(UseDelegate); // 创建委托
del(); // 使用委托
}
public static void UseDelegate()
{
Console.WriteLine("使用无参委托");
}
}
delegate void MyDelegate();
下面同上面是一样的效果
class MainClass
{
public static void Main(string[] args)
{
MyDelegate del = UseDelegate; // 简写创建委托
del();
}
public static void UseDelegate()
{
Console.WriteLine("使用无参委托");
}
}
delegate void MyDelegate();
输出:
使用无参委托
委托相互赋值
class MainClass
{
public static void Main(string[] args)
{
// 委托赋值给委托 需要是同一个委托类型
MyDelegate del = UseDelegate;
MyDelegate my = null;
my = del;
my();
}
public static void UseDelegate()
{
Console.WriteLine("使用无参委托");
}
}
delegate void MyDelegate();
输出:
使用无参委托
有参委托
class MainClass
{
public static void Main(string[] args)
{
MyDelegate myDelegate = UseDelegate; // 创建委托,方法的参数必须与委托的参数一致
myDelegate("Tom-Cat"); // 调用委托
}
public static void UseDelegate(string name)
{
// #34;" 里面可以直接写参数,但是需要使用 {参数名}
Console.WriteLine(#34;My Name Is {name}");
}
}
delegate void MyDelegate(string name);
使用有返回值的委托
class MainClass
{
public static void Main(string[] args)
{
MyDelegate myDelegate = UseDelegate;
int a = myDelegate("Tom-Cat");
Console.WriteLine("返回值: {0}",a);
}
public static int UseDelegate(string name)
{
Console.WriteLine(#34;My Name Is {name}");
return 1;
}
}
delegate int MyDelegate(string name);
输出:
My Name Is Tom-Cat
返回值: 1
泛型
泛型是用来替代不确定的数据类型,看下面代码
class MainClass
{
public static void Main(string[] args)
{
// 声明类的时候定义数据类型
Persion<string, int, double> p = new Persion<string, int, double>();
p.name = "Tom";
p.age = 10;
p.height = 170.50;
Console.WriteLine("p.name 的数据类型:{0},内容是:{1}",p.name.GetType(),p.name);
Console.WriteLine("p.age 的数据类型:{0},内容是:{1}", p.age.GetType(), p.age);
Console.WriteLine("p.height 的数据类型:{0},内容是:{1}", p.height.GetType(), p.height);
}
}
class Persion<T,T1,T2>
{
public T name;
public T1 age;
public T2 height;
}
输出:
p.name 的数据类型:System.String,内容是:Tom
p.age 的数据类型:System.Int32,内容是:10
p.height 的数据类型:System.Double,内容是:170.5
系统内置泛型委托
- Action 无返回值
class MainClass
{
delegate void A(int i);
public static void Main(string[] args)
{
Action<int> action = Print; // 等价于 下面这一条语句,相比之下不需要自己写 delegate void A(int)
A a = Print;
a(1);
action(1);
}
public static void Print(int i)
{
Console.WriteLine("true");
}
}
输出:
true
true
- Func 有返回值
class MainClass
{
delegate int A(int i);
public static void Main(string[] args)
{
// Func<参数类型1,....,参数类型8,返回值类型>
Func<int,int> action = Print;
A a = Print;
int aValue = a(1);
int bValue = action(9); // 调用的时候写需要进入方法的参数
Console.WriteLine("a(1)的返回值:{0},action(9)的返回值:{1}",aValue,bValue);
}
public static int Print(int i)
{
Console.WriteLine("true");
return i;
}
}
输出:
true
true
a(1)的返回值:1,action(9)的返回值:9
通过VS编译器中的程序集浏览器可以看到这两个委托
从下面这两幅图可以看到,Func是必须有一个返回值的参数,里面的参数可以最多可以有16个;Action可以没有参数,里面的参数最多也是16个
LINQ
LINQ:语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。
LINQ源数据:从应用程序的角度来看,原始源数据的特定类型和结构并不重要。 应用程序始终将源数据视为 IEnumerable<T> 或 IQueryable<T> 集合。
代码展示:
public static void Main(string[] args)
{
// List 继承了 IEnumerable接口,所以可以使用 Where
List<int> list = new List<int>();
list.Add(4);
list.Add(9);
list.Add(100);
list.Add(50);
// Where()使用了委托,括号里面可以直接使用 lambda表达式,下面会展示怎么使用lambda
foreach (var item in list.Where(i => i > 10))
{
Console.WriteLine(item);
}
}
输出:
100
50
使用数组实现同样的效果:
public static void Main(string[] args)
{
int[] list = { 4, 9, 100, 50 };
foreach (var item in list.Where(i => i > 10))
{
Console.WriteLine(item);
}
}
使用类似数据库的语句查询:
public static void Main(string[] args)
{
int[] list = { 4, 9, 100, 50 };
IEnumerable<int> vs = from item in list where item > 10 select item;
foreach (var item in vs)
{
Console.WriteLine(item);
}
}
lambda
(参数)=>{ 语句; }
匿名方法
当有一个方法只有委托在使用,且只使用一次,就可以使用匿名方法。使用方法看下面代码
class MainClass
{
delegate void Del();
public static void Main(string[] args)
{
// 直接在声明的时候写方法,方法直接用delegate命名,参数必须与委托一致,如果有返回值,需要写return
Del myDelegate = delegate ()
{
Console.WriteLine("匿名方法");
};
}
}
输出:
匿名方法
使用lambda 替代匿名方法
- 无返回值委托
class MainClass
{
delegate void Del();
public static void Main(string[] args)
{
Del myDelegate = () =>
{
Console.WriteLine("匿名方法");
};
}
}
与上面是一样的效果,=> 读作 goes to
class MainClass
{
public static void Main(string[] args)
{
// Action 足够应付大部分无返回值的委托
Action<int> action = (int i) =>
{
Console.WriteLine("匿名方法");
};
}
}
再简写一点
class MainClass
{
public static void Main(string[] args)
{
Action<int> action = (i) =>
{
Console.WriteLine("匿名方法");
};
}
}
如果只有一个参数,多个参数需要写括号
class MainClass
{
public static void Main(string[] args)
{
Action<int> action = i =>
{
Console.WriteLine("匿名方法");
};
}
}
- 有返回值委托
class MainClass
{
public static void Main(string[] args)
{
// 如果使用 delegate 的时候有参数,参数必须声明类型,Action、Func都需要遵守这一条
Func<int, int> func = delegate (int i) {
return i;
};
Console.WriteLine("func({0})的返回值是:{0}",func(9));
}
}
输出:
func(9)的返回值是:9
使用lambda简写
class MainClass
{
public static void Main(string[] args)
{
Func<int, int> func = (int i) =>{
return i;
};
Console.WriteLine("func({0})的返回值是:{0}",func(9));
}
}
再简写
class MainClass
{
public static void Main(string[] args)
{
Func<int, int> func = (i) =>{
return i;
};
Console.WriteLine("func({0})的返回值是:{0}",func(9));
}
}
如果只有一个参数也可以不写括号
class MainClass
{
public static void Main(string[] args)
{
Func<int, int> func = i =>{
return i;
};
Console.WriteLine("func({0})的返回值是:{0}",func(9));
}
}
如果只有方法体只有一条语句,可以省略大括号和return
class MainClass
{
public static void Main(string[] args)
{
Func<int, int> func = i =>i;
Console.WriteLine("func({0})的返回值是:{0}",func(9));
}
}
使用委托实现LINQ的where
class MainClass
{
public static void Main(string[] args)
{
int[] a = { 8, 90, 4, 20 };
// 使用了扩展方法,this关键词修饰的可以不写在括号里面
IEnumerable<int> data = a.MyWhere(i => i > 10);
foreach (var item in data)
{
Console.WriteLine(item);
}
}
}
// 扩展方法是写在静态类里面的静态方法,扩展方法必须有一个参数,且参数使用this关键词修饰
static class A
{
public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> data, Func<T, bool> func)
{
List<T> list = new List<T>();
foreach (var item in data)
{
if (func(item))
{
list.Add(item);
}
}
return list;
}
}
输出:
90
20
相关推荐
- java基础都在这了,小主们拿去吧(java基础总结大全)
-
-----面向对象---------面向对象和面向过程的区别?面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事务在整个问题中的行为。面向过程是分析出解决问...
- Java 8:一文掌握 Lambda 表达式 | CSDN 博文精选
-
作者|Android大强哥责编|郭芮出品|CSDN博客本文将介绍Java8新增的Lambda表达式,包括Lambda表达式的常见用法以及方法引用的用法,并对Lambda...
- 如何理解Python类中的self?(python方法中self.属性)
-
许多python初学者,在接触到python面向对象的时候,就被类中包含的方法中的self打败了,不知道self是何物?既然写在方法中,是必须参数,为何在调用方法的时候不给它传参数还能正常运行?和我们...
- javascript的this用法(javascript中的this)
-
this是Javascript语言的一个关键字。它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,functiontest(){this.x=1;}随着函数使用场合的不同,th...
- JavaScript 的 this 原理是什么?(js中this的含义)
-
JavaScript中的this是一个关键字,代表当前执行代码的上下文对象。它的值在运行时确定,根据不同的调用方式和执行环境,this的值也会发生变化。具体来说,this的取值规则如下:如果...
- 小白学习Java开发如何入门?你可能需要这份学习路线图
-
21世纪进入信息时代,信息科技给人类的生产和生活方式带来了深刻的变革,信息产业已成为推动国家经济发展的主导产业之一,Java作为含金量极高的一门IT技术,很多人希望从事这个行业,那么想学好Java,要...
- Java类与对象知识点总结(java第十一章类和对象)
-
#头号有新人##java#1.类与对象java是一门纯面向对象的语言,在java面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要是要依靠对象之间的交互完成一件事情。用面向对象的思想...
- JavaScript面试题精选:10个高频问题详解
-
引言JavaScript是现代Web开发的支柱。无论您是在准备面试还是复习知识,这里有10个经常被问到的JavaScript问题,配有简洁准确的答案。1.var、let和const有什么区别?v...
- 三石说:java基础 类与对象(java类和对象总结)
-
类:类是封装对象的行为和属性的载体,具有相同属行和行为的一类实体。类中包含方法和属性。类中的构造方法:1.构造方法没有返回值2.名称与类名相同,在构造方法中可以为成员变量赋值,也就是初始化成员变量,若...
- C#自学——委托、LINQ(c#中委托)
-
委托的概念委托是一种可以指向方法的数据类型(委托类型),可以声明委托类型的变量数据类型指的是类似类的,前面提到过一切皆对象,委托就是将方法当作对象使用声明委托delegate返回值类型委托类型名称...
- JVM(三)对象的生死判定和算法详解
-
导读:对象除了生死之外,还有其他状态吗?对象真正的死亡,难道只经历一次简单的判定?如何在垂死的边缘“拯救”一个将死对象?判断对象的生死存活都有那些算法?本文带你一起找到这些答案。在正式开始之前,我们先...
- 这几道面试题,可以考考自己(面试真题去哪里找)
-
选择几道主流面试题,让大家自我检验一下,理论与实践相结合,才能更容易拿到高薪。Copy如何在.NET中做deepcopy?1)使用序列化反序列化对象实现深度克隆2)使用反射实现深度克隆trycat...
- 掌握 C# 和 .NET:常用术语与概念(c#用于什么)
-
在群里看到一则招聘信息,《基本功扎实,对DDD、OO、IOC、AOP等有深刻认识,熟悉常用设计模式。》OO是什么??查了一下原来OO原来指的是面向对象编程(OOP),于是就总结了一些常用的术语...
- Java新特性:Lambda表达式(java lambda表达式的3种简写方式)
-
1、Lambda表达式概述1.1、Lambda表达式的简介Lambda表达式(Lambdaexpression),也可称为闭包(Closure),是Java(SE)8中一个重要的新特性。Lam...
- JS的this指向问题(js如何改变this指向)
-
一句话概括this指向:谁调用this就指向谁这句话可能太过广义,那么请看以下的各种this指向场景1.箭头函数(=>)箭头函数this的指向不会发生改变,也就是说在创建箭头函数时就已经确定了...
- 一周热门
- 最近发表
-
- java基础都在这了,小主们拿去吧(java基础总结大全)
- Java 8:一文掌握 Lambda 表达式 | CSDN 博文精选
- 如何理解Python类中的self?(python方法中self.属性)
- javascript的this用法(javascript中的this)
- JavaScript 的 this 原理是什么?(js中this的含义)
- 小白学习Java开发如何入门?你可能需要这份学习路线图
- Java类与对象知识点总结(java第十一章类和对象)
- JavaScript面试题精选:10个高频问题详解
- 三石说:java基础 类与对象(java类和对象总结)
- C#自学——委托、LINQ(c#中委托)
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)