天天看點

Unity開發之C#基礎-屬性與索引函數前言屬性索引函數索引函數的用法總結

前言

本章介紹到的是c#中的屬性和索引函數,他們在日常編碼中經常見到,大家要好好學習一下。

制作不易還請各位一鍵三連哦!

文章目錄

  • 前言
  • 屬性
    • 屬性的作用
      • 屬性隻可以包含一個通路函數
      • 屬性的本質
      • 通路函數的特性
      • 新特性的局限
  • 索引函數
  • 索引函數的用法
  • 總結

屬性

在遊戲中,我們通常會玩某個角色,或者某個武器,他們都會有自己對應的屬性

Unity開發之C#基礎-屬性與索引函數前言屬性索引函數索引函數的用法總結

那麼這些屬性是屬于這個人物或者裝備的,他們會給角色不同的加成,那麼在代碼中的屬性是什麼樣的作用呢?

屬性的作用

為了實作對資料的良好封裝,C#提供了屬性通路函數(簡稱屬性,Property),主要用于控制對字段的通路。屬性通路函數包括get通路函數和set通路函數,分别用于對字段的讀取和設定。

下面我們來看一下屬性的文法:

using System;

namespace C_Sharp屬性與索引函數
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }

    //建立一個學生類
    class Student
    {

        string name;//聲明變量name
        public string Name//定義屬性
        {
            set
            {
                name = value;
            }

            get
            {
                return name;
            }
        }
        

    }
}

           

get通路函數沒有參數,預設傳回類型是屬性的類型,表示屬性傳回值。

set通路函數的預設傳回類型為void,value表示外部傳遞的屬性值。

在上面的代碼中我們發現,Student類中的name字段,也就是他的名字的修飾符我們是沒有書寫的,也就是預設的私有的,那麼我們想要對name字段進行通路或者指派操作,就需要通過他的公有屬性Name,下面我們來看一下如何通過公有屬性進行操作

using System;

namespace C_Sharp屬性與索引函數
{
    class Program
    {
        //聲明一個學生類對象,用來調用學生類中的變量和函數等
        static Student student = new Student();

        static void Main(string[] args)
        {
            student.Name = "想吃烤地瓜";//通過公有屬性來進行通路
            Console.WriteLine(student.Name);//輸出更改後的名字
        }
    }

    //建立一個學生類
    class Student
    {
        string name;//聲明變量name
        public string Name//定義屬性
        {
            set
            {
                name = value;
            }
            get
            {
                return name;
            }
        }
    }
}

           

屬性隻可以包含一個通路函數

如果一個屬性中隻有get通路函數,那麼屬性值不能被修改

private string name; 
public string Name 
{ 
	get 
	{ 
	return name; 
	} 
}
           

如果一個屬性中隻含有set通路函數,那麼屬性值不能被讀取。

private string name; 
public string Name 
{ 
	set 
	{
		name = value; 
	} 
}
           

屬性的本質

屬性的典型用法是一個公有屬性對應一個私有字段,但這并不是強制要求。屬性的本質是方 法,在代碼中可以進行各種控制計算。

private int birthYear; 
public int Age 
{ 
	get 
	{ 
		return 2021 - birthYear; 
	} 
}
           

通路函數的特性

c#3.0版本以後,推出了一些新的特性

由原來的這樣書寫:

public class Student 
{ 
	private string name; 
	public string Name 
	{ 
		get 
		{ 
			return name; 
		} 
		set 
		{ 
			name = value; 
		} 
	} 
}
           

可以簡寫為新的:

public class Student 
{ 
	public string Name 
	{ 
		get; 
		set; 
	} 
}
           

新特性的局限

雖然新的特性友善了許多,但同樣也有局限性:

自動屬性的使用也存在一定的限制:首先它要求必須同時包含get和set通路函數, 或者隻包含get函數;其次是自動生成的字段是完全隐藏的,即使在目前類的方法 代碼中也不能直接通路,而是仍需通過屬性進行讀寫

索引函數

索引函數又稱為索引器(Indexer)是C#引入的一個類成員,它使得類中的對象可以 像數組那樣友善、直覺的被引用

  1. 索引器非常類似于屬性,但索引器可以有參數清單,且隻能作用在執行個體對象上,而不能在類上直接作用
  2. 定義了索引器的類可以像通路數組一樣,可以使用[ ] 運算符,通過對象[下标]的方式通路類的成員

索引函數的用法

程式設計過程中常常會遇到這樣一些類,它們的主要作用是維護一組資料的集合

  1. 索引函數維護的可以是——多個離散的字段
  2. 索引函數維護的可以是——數組類型的字段

下面讓我們來示範一下索引函數的用法:

using System;

namespace C_Sharp屬性與索引函數
{
    class Program
    {


        static void Main(string[] args)
        {

        }
    }
    class Teacher
    {
        public string Name { get; set; }
        private string homePhone; 
        private string officePhone; 
        private string mobilePhone; 
        public Teacher(string name) 
        { 
            this.Name = name; 
        }
        public string this[int index] 
        { 
            get 
            { 
                if (index == 0) 
                    return homePhone; 
                else if (index == 1) 
                    return officePhone; 
                else if (index == 2) 
                    return mobilePhone; 
                else return "無此電話号碼"; 
            } set 
            { 
                if (index == 0) 
                    homePhone = value; 
                else if (index == 1) 
                    officePhone = value; 
                else if (index == 2) 
                    mobilePhone = value; 
                else
                    Console.WriteLine("沒有該類型的電話");
            } 
        }
    }
}
           

可能大家會覺得這樣的寫法好複雜,但是他卻可以大大的提高代碼的可讀性:

Teacher t1 = new Teacher("張三"); 
t1[0] = "66666666"; 
t1[1] = "1367772800"; 
t1[2] = "1111111111";
Console.WriteLine(t1[0] + "," + t1[1] + "," + t1[2]);
           

我們不難發現的是,索引函數其實隻是在屬性的基礎上作了進一步的擴充,更有利于通路屬性以及對屬性做一些操作。

索引函數和屬性一樣包含get和set通路函數,使用this關鍵字加中括号[]進行定義,其中的參 數表示所要通路的集合元素的下标。使用時隻要在對象後的中括号裡指定下标就可以通路目标元素

總結

屬性和索引函數會經常看到,大家需要熟練掌握并且可以運用,下期我們将會講解面向對象中類的繼承