此篇随笔仅仅作为记录和参考。
在写项目的时候看到了一段比较有意思的单例.如下图:
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 单例模型 /// </summary> /// <typeparam name="T">模板</typeparam> public class MonoSingleton<T> : MonoBehaviour where T :Component { private static T _instance; private static readonly object _lock = new object(); public static T Instance { get { if(_instance == null) { lock (_lock) { _instance = FindObjectOfType<T>(); if(_instance == null) { GameObject obj = new GameObject("TempObj"); _instance = obj.AddComponent<T>(); } } } return _instance; } } }
在这里面我最好奇的是为什么要使用这一段
public class MonoSingleton<T> : MonoBehaviour where T :Component
后来我打算去找答案,东西很久没有用都忘了什么作用了。
2.where 在SQL语句中是限制条件的意思
select column_name ,column_name form table_name WHERE column_name operator value;
3.where在C# 指的是约束
为什么要使用约束?官方给的解释是:
使用约束的原因
约束指定类型参数的功能和预期。 声明这些约束意味着你可以使用约束类型的操作和方法调用。 如果泛型类或方法对泛型成员使用除简单赋值之外的任何操作或调用 System.Object 不支持的任何方法,则必须对类型参数应用约束。 例如,基类约束告诉编译器,仅此类型的对象或派生自此类型的对象可用作类型参数。 编译器有了此保证后,就能够允许在泛型类中调用该类型的方法。 以下代码示例演示可通过应用基类约束添加到(泛型介绍中的)GenericList<T> 类的功能。
4.为了验证一下,我将where 后面的
where T :Component
这一部分删除,发现
_instance = FindObjectOfType<T>(); //提示是:类型“T”不能用作泛型类型或方法“Object.FindObjectOfType<T>()"中的类型参数”T“. //没有从”T“到”UnityEngine.Object"装箱转换或者类型参数转换
第一反应是有点懵,官方 指的 和这个有什么关系嘛
约束指定类型参数的功能和预期。
//在 Object 中找到了该方法 public static T FindObjectOfType<T>() where T : Object;
用我目前理解到了东西来说,应该是 要求 泛型T 是继承自 Object 的,才可以使用 FindObjectOfType<T>() 这个函数 ,所以我觉得
Component 必定也是继承自 Objet 的,所以才可以使用这函数。
//在Component 类中找到了这个 public class Component : Object
简单的说就是,还是直接用官方的说法:
约束告知编译器类型参数必须具备的功能。 在没有任何约束的情况下,类型参数可以是任何类型。 编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类。
详情直接看文档比较实在,水平有限做个记录。文档网址: https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters