属性:
1,主要作用将读,写权限分开。如果不使用属性,仅使用public, protected, private,这几个限制都是读,写属性一起的,可 读就可写,不可读同时也不可写。不能实现只读不可写,只写不可读的需求。
2,更好的安全性:可以在SET中通过条件判断来限制非法值等。这虽然可以通过函数来实现,但不如属性的调用简洁方便。
3,更好的灵活性:给属性赋值或取值时,Age可以对变量age进行运算后得到(代码如下)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript1 : MonoBehaviour
{
private int age;
public int Age
{
get { return age; }
set
{
if (value >= 18 && value < 60)//大于18岁小于60岁的成年人
age = value;
}
}
void Start () {
}
void Update () {
}
}
构造
1.构造函数的命名必须和类名完全相同;而一般方法则不能和类名相同. 2.构造函数的功能主要用于在类的对象创建时定义初始化的状态.它没有返回值,也不能用void来修饰.这就保证了它不仅什么也不用自动 返回,而且根本不能有任何选择.而其他方法都有返回值.即使是void返回值,尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而 这些东西可能是不安全的. 3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用,一般方法在程序执行到它的时候被调用. 4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略不去Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的.而一般方法不存在这一特点 简单的来说构造函数就是用来创建对象用的,说的专业些叫实例化对象。(代码如下)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript1 : MonoBehaviour
{
public NewBehaviourScript1(){ }//无参构造函数--也可以不写,系统在运行过程中会默认创建
string m_str; int age;
// 有参构造函数,如若实例化此类,则可以直接 给m_str age赋值
// 如:NewBehaviourScript1 m_new = new NewBehaviourScript1("张三",26);
public NewBehaviourScript1(string str, int temp)
{
m_str = str;
age = temp;
}
void Start () {
}
void Update () {
}
}
泛型:
遇到功能非常相似的模块,只是它们处理的数据不一样,用同一个方法来处理传入不同种类型参数的方法就是泛型。
当然object是所有类型的基类,也可以用object解决,但是object存在装箱和拆箱,会损耗程序的性能,在比较之下就采用泛型来解决这些问题。(泛型创建的时候只是指定一个特定类型的占位符,并不是真正的类型,不存在装箱,拆箱)
泛型在声明的时候可以不指定具体的类型,但是在使用的时候必须指定具体类型.
如果子类也是泛型的,那么继承的时候可以不指定具体类型,如:public class Generic<T> : IGeneric<T>
比如: List Dictionary Queue Stack LinkedList 都属于泛型
1.泛型方法
using System;
using System.Collections.Generic;
using UnityEngine;
public class GenericMethod
{
public static void Show<T>(T tParameter)
{
Console.WriteLine("This is {0},parameter={1},type={2}",
typeof(GenericMethod), tParameter.GetType().Name, tParameter.ToString());
}
}
//调用
public class NewBehaviourScript1 : MonoBehaviour
{
int iValue = 123;
string sValue = "456";
DateTime dtValue = DateTime.Now;
void Start ()
{
GenericMethod.Show<int>(iValue);
GenericMethod.Show<string>(sValue);
GenericMethod.Show<DateTime>(dtValue);
}
}
2.泛型类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript1<T>
{
public T m_temp;
}
public class NewBehaviourScript2 : MonoBehaviour
{
void Start ()
{
// T是int类型
NewBehaviourScript1<int> m_new1_int = new NewBehaviourScript1<int>();
m_new1_int.m_temp = 123;
// T是string类型
NewBehaviourScript1<string> m_new1_string = new NewBehaviourScript1<string>();
m_new1_string.m_temp = "张三";
}
}
3. 泛型接口和泛型委托
泛型接口
public interface INewBehaviourScript<T>
{
//泛型类型的返回值
T Func(T t);
}
public delegate void Func_name<T>(T t);//泛型委托
4.泛型约束
所谓的泛型约束,实际上就是约束的类型T。使T必须遵循一定的规则。比如T必须继承自某个类,或者T必须实现某个接口 等等。那么怎么给泛型指定约束?其实也很简单,只需要where关键字,加上约束的条件
泛型约束总共有五种:
T:struct 类型参数必须是值类型(int float等)
T:class 类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型
T:new() 类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定
T:基类名 类型参数必须是指定的基类或派生自指定的基类
T:接口名称 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型
// 值类型类型约束
public void Show<T>(T t) where T : struct
// 引用类型约束
public void Show<T>(T t) where T : class
// new()约束-----无参数构造函数的约束
public void Show<T>(T t) where T : new()
// 基类约束:约束T必须是People类型或者是People的子类
// 注意:基类约束时,基类不能是密封类,即不能是sealed类。sealed类表示该类不能被继承,在这里用作约束
// 就无任何意义,因为sealed类没有子类。
public void Show<T>(T tParameter) where T : People
// 接口约束---ISports是一个接口
public void Show<T>(T t) where T : ISports
// 泛型约束也可以同时约束多个,注意:有多个泛型约束时,new()约束一定是在最后
// 例如:
public void Show<T>(T temp)
where T : People, ISports, IWork, new()
{
Console.WriteLine($"{temp.Id}_{temp.Name}");
temp.Hi();
temp.Pingpang();
temp.Work();
}
5.泛型的协变和逆变--------先不做讲解