类和对象
- 类型参数(type parameters)类定义时指定一组代表参数类型。然后再声明类的时候可以定义相应的参数类型,如下例pair的类型参数是TFirst和TSecond
public class Pair<TFirst,TSecond>
{
public TFirst First;
public TSecond Second;
}
Pair<int,string> pair = new Pair<int,string> { First = 1, Second = "two" };
int i = pair.First; // TFirst is int
string s = pair.Second; // TSecond is string
- 静态字段、实例字段、静态方法,实例方法、静态类。
在静态方法中引用 this 会生成错误。实例方法可以访问静态字段和实例字段,但是静态方法只能访问静态字段,且不能调用this。
虚方法、重写方法和抽象方法
-
调用虚方法时,为其调用方法的实例的运行时类型决定了要调用的实际方法实现代码。 调用非虚方法时,实例的编译时类型是决定性因素。
-
抽象方法是没有实现代码的虚方法。 抽象方法使用 abstract 修饰符进行声明,只能在同样声明了 abstract 的类中使用。必须在所有非抽象派生类中重写抽象方法。
属性和字段的区别
属性是对字段的封装,属性的实质是方法(get或set方法)。如果允许自由读写,对取值范围没有约束,值的变化不会影响类中其他成员就使用公共字段,反之则使用属性。
接口
- 接口定义了可由类和结构实现的协定,接口可以包含方法、属性、事件和索引器。接口不提供所定义成员的实现,仅指定必须由实现接口的类或结构提供的成员。
- 接口的特殊性是:当定义一个类时,可以派生自多重接口,而类只能可以从仅有的一个类派生。
泛型
还没搞懂
元祖
可以重载Deconstruct方法来析构此类型的实例
using System;
public class Person
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string City { get; set; }
public string State { get; set; }
public Person(string fname, string mname, string lname,
string cityName, string stateName)
{
FirstName = fname;
MiddleName = mname;
LastName = lname;
City = cityName;
State = stateName;
}
// Return the first and last name.
public void Deconstruct(out string fname, out string lname)
{
fname = FirstName;
lname = LastName;
}
public void Deconstruct(out string fname, out string mname, out string lname)
{
fname = FirstName;
mname = MiddleName;
lname = LastName;
}
public void Deconstruct(out string fname, out string lname,
out string city, out string state)
{
fname = FirstName;
lname = LastName;
city = City;
state = State;
}
}
public class Example
{
public static void Main()
{
var p = new Person("John", "Quincy", "Adams", "Boston", "MA");
// Deconstruct the person object.
var (fName, lName, city, state) = p;
Console.WriteLine($"Hello {fName} {lName} of {city}, {state}!");
}
}
委托
委托是引用类型,可以把它看作是用来存方法的一种类型。比如说类型string用来定义存取字符串的变量,那么委托类型delegate就可以用来定义存方法的变量。委托和类一样,是一种用户自定义类型。但类表示的是数据和方法的集合,而委托表示的是一个或多个方法的集合。你可以把delegate看作一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型
- 委托是C#实现回调函数的一种机制