接口的默认实现
实现类中可以不实现接口中有默认实现的方法,以下代码不报错
public interface IPerson
{
void Say()
{
Console.WriteLine("hello");
}
}
public class Teacher:IPerson
{
}
但是不可以通过实现类的实例调用接口中的方法,因为没有实现,只能通过接口调
IPerson p = new Teacher();
p.Say();
接口的静态成员
public interface IPerson
{
private static string DefaultName = "fan";
static void SetDefaultName(string name)
{
DefaultName = name;
}
}
然后在调用的时候,我们可以在IPerson接口上先设置默认值:
IPerson.SetDefaultName("fan11111");
IPerson p = new Teacher();
Deconstructor 和 位置匹配模式
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public Student(string name, int age)
{
Name = name;
Age = age;
}
public Student() { }
public void Deconstruct(out string name, out int age)
{
name = Name;
age = Age;
}
}
这里面的下划线叫做“discard”(丢弃),表示我们不会使用它不关心它。 类中需要加Deconstruct方法
Student s = new Student("fan", 18);
bool r1 = s is Student(_, 15);//false
bool r2 = s is Student("fan", _);//true
bool r3 = s is { Name: "fan", Age: 18 };//属性匹配,true
bool r4 = s is Student && s is { Name: "fan", Age: 18 };//同时判断类型和属性值
Range类型
用于方便的从一个序列中提取一个子序列
int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Range range = 1..5;//索引范围:1,2,3,4 不包括5
int[] numbers1 = numbers[range];//2,3,4,5
int[] numbers2 = numbers[..];//1,2,3,4,5,6,7,8,9,10
Index类型
Index index1 = ^2;//倒数第二
Index index2 = ^0;//相当于arr.Length
int[] numbers3 = numbers[3..^2];//4, 5, 6, 7, 8
int[] numbers4 = numbers[0..^0];//相当于numbers[..]
int[] numbers5 = numbers[^4..];//7,8,9,10
int number = numbers[^1];//10,倒数第一个元素