=>读作 goes to,是C#3.0新增的内容
Lambda
委托
delegate int Method(int a, int b);
Method m += (a ,b) => a + b;
Console.WriteLine(m(2, 3));
linq
比较常用的就是作为linq表达式
internal abstract class GeoService
{
internal abstract void Update(GeoLocation location);
internal abstract string Name { get; }
}
private List<GeoService> _geoServices = new List<GeoService>();
private void NotifyLocationChanged(GeoLocation location)
{
_geoServices.ForEach(g => g.Update(location));
}
参数g没有定义类型是因为他自动推断出类型来了,因为这个list能遍历的东西只有这个。
这个语句里,就是遍历这个list列表,对每个项执行一下update方法。
作为参数
RelayCommand(() => this.AddPerson(), () => this.CanAddPerson());
可以翻译为 RelayCommand(参数一, 参数二);
参数一 :() => this.AddPerson()
参数二 :() => this.CanAddPerson()
() => this.AddPerson() 的意思是 一个没有参数的方法,返回 this.AddPerson(),而这个返回值的类型不用指定,系统会自动判断
同理 () => this.CanAddPerson() 就是 一个没有参数的方法返回this.CanAddPerson()
表达式主体定义
成员 | 开始提供支持的版本 |
---|---|
方法 | C#6 |
只读属性 | C#6 |
Property | C#6 |
构造函数 | C#6 |
终结器 | C#6 |
索引器 | C#6 |
方法
expression-bodied 方法包含单个表达式,它返回的值的类型与方法的返回类型匹配;或者,对于返回 void 的方法,其表达式则执行某些操作。 例如,替代 ToString 方法的类型通常包含单个表达式,该表达式返回当前对象的字符串表示形式。
下面的示例定义 Person 类,该类通过表达式主体定义替代 ToString。 它还定义向控制台显示名称的 DisplayName 方法。 请注意,ToString 表达式主体定义中未使用 return 关键字。
using System;
public class Person
{
public Person(string firstName, string lastName)
{
fname = firstName;
lname = lastName;
}
private string fname;
private string lname;
public override string ToString() => $"{fname} {lname}".Trim();
public void DisplayName() => Console.WriteLine(ToString());
}
class Example
{
static void Main()
{
Person p = new Person("Mandy", "Dejesus");
Console.WriteLine(p);
p.DisplayName();
}
}
只读属性
从 C# 6 开始,可以使用表达式主体定义来实现只读属性。 为此,请使用以下语法:
PropertyType PropertyName => expression;
下面的示例定义 Location 类,其只读 Name 属性以表达式主体定义的形式实现,该表达式主体定义返回私有 locationName 字段值:
public class Location
{
private string locationName;
public Location(string name)
{
locationName = name;
}
public string Name => locationName;
}
属性
从 C# 7.0 开始,可以使用表达式主体定义来实现属性 get 和 set 访问器。 下面的示例演示其实现方法:
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
构造函数
构造函数的表达式主体定义通常包含单个赋值表达式或一个方法调用,该方法调用可处理构造函数的参数,也可初始化实例状态。
以下示例定义 Location 类,其构造函数具有一个名为“name”的字符串参数。 表达式主体定义向 Name 属性分配参数。
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
终结器
终结器的表达式主体定义通常包含清理语句,例如释放非托管资源的语句。
下面的示例定义了一个终结器,该终结器使用表达式主体定义来指示已调用该终结器。
public class Destroyer
{
public override string ToString() => GetType().Name;
~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");
}
索引器
与使用属性一样,如果 get 访问器包含返回值的单个表达式或 set 访问器执行简单的赋值,则索引器 get 和 set 访问器包含表达式主体定义。
下面的示例定义名为 Sports 的类,其中包含一个内部 String 数组,该数组包含大量体育运动的名称。 索引器的 get 和 set 访问器都以表达式主体定义的形式实现。
using System;
using System.Collections.Generic;
public class Sports
{
private string[] types = { "Baseball", "Basketball", "Football",
"Hockey", "Soccer", "Tennis",
"Volleyball" };
public string this[int i]
{
get => types[i];
set => types[i] = value;
}
}