一、泛型
1.泛型的概念
泛型,我们从字面意义上可以将它通俗的解释为“很宽泛的类型”,类似于C++语言中的模板机制,在数据结构中出现的非常频繁。<T>是泛型的标志符号,里面的字母“T”是类型占位符,可以代表任何类型,在定义泛型类,泛型方法的时候,使用“T”代替,在真正使用的时候,再传递真正对应的类型。
2.泛型类
在开发中List<T>和Dictionary<K,V>两个数据结构就是“泛型类”。<T>标志符号里面的“T”是Type的缩写,可以用任何字母段替代,不区分大小写,一般默认大写字母。类中有几个类型不确定,就在<>内写几个“类型占位符”。
例如:
public class MyClass<T>{ }
public class MyClass<A,B>{ }
public class MyClass<C,D,E,F,G>{ }
3.泛型方法
在Unity 中最常使用的GetComponent<T>()就是“泛型方法”。在定义方法的时候,方法名的后面使用<T>来定义。
如果当前的方法所在的类中,已经定义了这个类型,方法名的后面就不需要再次定义;反之则必须定义。
例如:
public T MyFun() { }
Public T MyFun<T>(T name){ }
① class Myclass
{
public override void Method<T>(T t)
{ }
}
② class SampleClass<T>
{
void Swap(T t1, T t2) { }
}
* 二、Unity中的两种单例写法
1.Mono 子类C#脚本单例
①定义一个当前类的公开、静态、当前类类型返回值的一个字段;
②在Awake 事件方法中完成该字段的赋值。
public class MyClass : MonoBehaviour
{
static MyClass _instance;
void Awake () {
_instance = this;
}
public static MyClass Instance {
get {
return _instance;
}
}
}
2.非Mono 子类C#脚本单例
①定义一个当前类的私有,静态,当前类类型返回值的字段;
②创建一个无参私有构造方法;
③创建一个公开,静态,用于封装字段的属性;在该属性内实现单例。
public class MyClass
{
private static MyClass _instance = new MyClass();
public static Class Instance {
get {
return _instance;
}
}
private MyClass() {}
}
三、委托
1.委托简介:委托可以把方法当做(方法的)参数来传递。
2.委托的语法
访问修饰符delegate 返回值类型委托名称(参数列表);
public delegate void CalcDelegate(int a, int b);
①委托声明的关键字是:delegate
②委托声明的位置可以在类外,也可以在类内;
区别是在VS 控制台项目中创建的脚本,都处于一个命名空间(namespace)下,而在Unity 里面创建的脚本却没有namespace 这个标示代码块,但是这些脚本默认处于同一命名空间下。
定义在类外,同命名空间内其他的类也可以使用这个委托;
定义在类内,则是作为类的成员存在,只能在当前类中访问。
③声明的委托要和要绑定的方法的“签名”保持一直;
签名指的是方法的返回值类型,以及参数列表的类型。
举例说明:100 和3.14 都是数学意义上的数字,但是两个却是不同的类型,一个是int,
一个是float。
方法的类型是委托,但是这里的“委托”是宽泛意义上的,类似于上面的“数字”。当你需要定义某个方法的委托的时候,就需要保证签名一致。签名由方法的返回值类型,方法参数列表的类型,个数,顺序决定的。
总结起来委托的步骤就是:
①定义具备相同“签名”的多个方法;
②根据方法的的签名定义相同签名的委托;
③把方法当成委托类型的参数进行传递。
最后我们通过编码实现一个计算器的实际案例来加深这部分知识点的理解
public deletegate int Compute(int a,int b); //定义一个委托(返回值类型int,2个参数)
class Program
{
static void Main(string[] args)
{
Calculate(Add(10,30));
}
static int Add(int a,int b)
{
return a + b;
}
static int Sub(int a,int b)
{
return a - b;
}
static int Mult(int a,int b)
{
return a * b;
}
static int Divide(int a,int b)
{
return a / b;
}
static void Calculate(Compute com,int a,int b)
{
Console.WriteLine(com(a + b));
}
}