1. C# 委托
委托是一种引用类型,它表示对具有特定参数列表和返回类型的方法的引用
语法:
public delegate <return type> <delegate-name> <parameter list>
- return type 表示返回类型 delegate-name 表示委托名 parameter list 表示参数列表。
定义:
public delegate string TranslationDelegate(string name)
详细事例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
public delegate void Translation(string name);
static void Main(string[] args)
{
//注意 这里使用了多播委托
Translation tr = new Translation(Eating);
tr += new Translation(Watch);
tr("戴教授");
Console.WriteLine();
}
private static void Eating(string name)
{
Console.WriteLine(name + "在吃放");
}
private static void Watch(string name)
{
Console.WriteLine(name+"在看电视");
}
}
}
2. 隐式类型与匿名类型
2.1 隐式类型
语法:
var 变量 = 初始值;
事例:
新建实体类 User
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class User
{
public string name { get; set; }
public int age { get; set; }
public bool isMarry { get; set; }
User()
{
}
User (string name,int age,bool isMarry)
{
this.name = name;
this.age = age;
this.isMarry = isMarry;
}
}
}
主函数代码
static void Main(string[] args)
{
var user = new User("李金", 20, false);
Console.WriteLine("user类型:" + user.GetType());
Console.WriteLine("name类型:" + user.name.GetType());
}
使用隐式类型虽然可以简化代码,但同样也存在限制。
- 变量必须初始化,否则报错
var a ; //会报错 应 var a = 1;
- 声明变量,推断出类型后,变量的类型不能改变
var a = 1; a = "1"//错误
2.2 匿名类型
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,无需先显示定义一个类型。
用法如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
public delegate void Translation(string name);
static void Main(string[] args)
{
var a = new { age = 20,name = "张三",id=1001 };
Console.WriteLine("姓名:{0},编号:{1},年龄:{2}",a.name,a.id,a.age);
}
}
}
3. C#扩展方法与yield关键字
扩展方法
C#扩展方法是允许使用实例方法的调用语法来调用静态方法的语言功能。C#扩展方法至少有一个参数。
使用实例:
创建一个静态类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
public static class Class1
{
public static int Countst(this string str)
{
//将字符串分割用于计算数量
return str.Split(new char[] { ' ', '.', '?' },StringSplitOptions.RemoveEmptyEntries).Count();
}
}
}
调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
public delegate void Translation(string name);
static void Main(string[] args)
{
string str = "sdfsdf/sadfasdfasdf,adsfsadf.dsfasdf";
int count = str.Countst();
Console.WriteLine(count);
}
}
}
注意:扩展方法参数前面必须加this修饰符
yield关键字
迭代器C#2.0中的新功能
使用如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
public static IEnumerable<User> getList(List<User> list,int age)
{
foreach (var item in list)
{
if (item.age == age)
{
yield return item;
}
}
}
static void Main(string[] args)
{
List<User> list = new List<User>();
list.Add(new User("张三", 20, false));
list.Add(new User("李四", 20, false));
list.Add(new User("王五", 21, true));
IEnumerable<User> obj = getList(list,20);
foreach (var item in obj)
{
Console.WriteLine("姓名:{0},年龄:{1}",item.name,item.age);
}
}
}
}
Lambda表达式
Lambda表达式是一个匿名方法,即没有方法名的方法。
语法
形参列表 => 方法体 ·
public delegate void Del(string str)
public static void GetSay(){
Del md = new Del(x=>{
Console.WriteLine("你好:"+x)
})
md("李四");
}
static void Main(string [] args){
GetSay();
//控制台输出 你好:李四
}