[Unity中文课堂教程] C#中级编程 - 04 - 泛型/构造函数/ref
原教程视频地址:
《[Unity中文课堂教程预告片] C#中级编程_哔哩哔哩_bilibili》
《C#中级编程 - Unity中文课堂 (u3d.cn)》
《C# 泛型(Generic) | 菜鸟教程 (runoob.com)》
《C# 泛型讲解_泛型基础_C# Generic_天马3798-CSDN博客_c#泛型》
内容短小精悍简练,每节只有几分钟。很适合用来预习和复习。
类的构造函数
《C# 类(Class) | 菜鸟教程 (runoob.com)》(构造函数)先补充这个概念,和python的形势不太一样,之前没用到所以忘记了。
- 类的 构造函数 是类的一个特殊的成员函数,当创建类的新对象时执行。
- 构造函数的名称与类的名称完全相同,它没有任何返回类型。
脚本①:
public class Exercise_4_7 : MonoBehaviour
{
int num = 0;
static int num_s = 0;
public Exercise_4_7()
{
num_s += 1;
num += 1;
Debug.Log("创建了类对象,调用了构造函数");
}
public int num_get()
{
return num;
}
public int nums_get()
{
return num_s;
}
}
脚本②:
public class Exercise_4_8 : MonoBehaviour
{
void Start()
{
Exercise_4_7 myClass = gameObject.AddComponent<Exercise_4_7>();
Exercise_4_7 myClass_0 = gameObject.AddComponent<Exercise_4_7>();
Debug.Log("num = " + myClass.num_get());
Debug.Log("nums = " + myClass.nums_get());
}
}
ref:按引用传递参数
《ref 关键字 - C# 参考 | Microsoft Docs》菜鸟教程例子中看到了,补充一下。
- 理解为传递指针,传递参数本身,而不是传递参数的值。也就说在内部修改形参就会直接影响修改了实参。
void Method(ref int refArgument)
{
refArgument = refArgument + 44;
}
int number = 1;
Method(ref number);
Console.WriteLine(number);
- 在c#中还要其他
方法参数 关键字,如params 、in 、out 。这些之后再详述吧。
泛型方法/类
- 传参前,一般需要先规定类型,然后函数内就可对该类型作出针对的操作运算。而c#允许连同类型也设为一个参数,在调用时再设定。这种操作称为泛型。
- 因为类型不确定,所以泛型不能作大部分操作运算,比如加减乘除、方法调用等,会在编译时就报错。基本上常用的是一些赋值或删除空对象的操作。
脚本①:
public class Exercise_4_7 : MonoBehaviour
{
public void Swap<T>(ref T num_0, ref T num_1)
{
T num_3;
num_3 = num_0;
num_0 = num_1;
num_1 = num_3;
Debug.Log("使用泛型方法交互了 "+num_0+" 和 "+num_1+" 的内容");
}
}
脚本②:
public class Exercise_4_8 : MonoBehaviour
{
void Start()
{
Exercise_4_7 myClass = gameObject.AddComponent<Exercise_4_7>();
int num_0 = 1,num_1 = 2;
myClass.Swap<int>(ref num_0, ref num_1);
}
}
- 一般为了方便调用,应该将该泛型方法设为静态。这就可省去创建对象一步了。
- 泛型除了创建方法或类外,还能创建泛型接口、泛型事件和泛型委托,这里暂不细说。
泛型约束
- 在声明泛型方法和泛型类的时候,都可以给泛型加上一定的约束来满足我们特定的一些条件。
public class CacheHelper<T> where T:new()
{
}
- 泛型类和泛型方法差不多,在实例化时会需要在尖括号内输入类型。其实在unity中早有用过泛型类,比如上面例子中,实例化 “继承了
MonoBehaviour 的类” 时用到的方法。
应用例子
在之前学习麦扣的教程时,第一次接触到泛型的用法。当时看不懂其作用,现在再看,个人认为是打包创建静态类的过程。下面贴出全部代码,以示参考学习。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singleton<T> : MonoBehaviour where T:Singleton<T>
{
private static T instance;
public static T Instance
{
get
{
return instance;
}
}
protected virtual void Awake()
{
if (instance != null)
Destroy(gameObject);
else
instance = (T)this;
}
public static bool IsInitialized
{
get
{
return instance != null;
}
}
protected virtual void OnDestroy()
{
if(instance == this)
{
instance = null;
}
}
}
|