前言
本章介紹到的是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#引入的一個類成員,它使得類中的對象可以 像數組那樣友善、直覺的被引用
- 索引器非常類似于屬性,但索引器可以有參數清單,且隻能作用在執行個體對象上,而不能在類上直接作用
- 定義了索引器的類可以像通路數組一樣,可以使用[ ] 運算符,通過對象[下标]的方式通路類的成員
索引函數的用法
程式設計過程中常常會遇到這樣一些類,它們的主要作用是維護一組資料的集合
- 索引函數維護的可以是——多個離散的字段
- 索引函數維護的可以是——數組類型的字段
下面讓我們來示範一下索引函數的用法:
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關鍵字加中括号[]進行定義,其中的參 數表示所要通路的集合元素的下标。使用時隻要在對象後的中括号裡指定下标就可以通路目标元素
總結
屬性和索引函數會經常看到,大家需要熟練掌握并且可以運用,下期我們将會講解面向對象中類的繼承