C# 构造 属性 泛型

属性:

        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.泛型的协变和逆变--------先不做讲解

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁月轻狂客rx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值