面向对象——索引器
索引器:封装了类的私有数组的操作,没有名字
定义索引器的格式:
public 数组中元素的数据类型 关键字(this) [下标]
{
get//根据下标获取数组中该下标所对应的元素
{
//先判断下标是否越界
if (下标 >= 私有数组元素的个数)
{
throw new IndexOutOfRangeException(“数组越界”)
}
return 私有数组[下标]
}
set//根据下标获取给数组中该下标所对应的元素赋一个新值
{
//先判断下标是否越界
if (下标 >= 私有数组元素的个数)
{
throw new IndexOutOfRangeException(“数组越界”)
}
私有数组[下标] = value;
}
}
怎样访问类的属性::在其他类中,通过创建封装索引器的类的实例(对象),通过该对象[下标]的形式来访问索引器。这样可以实现对类私有数组的间接操作(一方面获取字段所保存的值,另一方面给私有字段赋一个新的值)
什么时候使用索引器?
(1)当有一个集合的值属于且只属于类本身的时候,可以使用索引器。
索引器在使用时应注意:(1)this关键字用于定义索引器。(2)Value关键字代表由set索引器获得的值。(3)、索引器不一定根据整数值进行索引,由你决定索引器的参数的类型。(4)、索引器的[]里面可以是任意参数列表。(5)索引器可被重载。
索引器和数组比较:
(1)索引器的索引值(Index)类型不受限制
(2)索引器允许重载
(3)索引器不是一个变量
索引器和属性的不同点
(1)属性以名称来标识,索引器以函数形式标识
(2)索引器可以被重载,属性不可以
(3)索引器不能声明为static,属性可以
例1:
public class Grils
{
private string[] names = new string[5];
public string this[int n]
{
get { return names[n]; }
set { names[n] = value; }
}
}
class Program
{
static void Main(string[] args)
{
Grils gls = new Grils();
gls[0] = "小婵";//赋值调用Set访问器
string r = gls[0];//读取调用Get访问器
Console.WriteLine("{0}",r);
}
}
例2、 以字符串作为下标,对索引器进行存取
public class IndexerClass
{
//用string作为索引器下标的时候,要用Hashtable
private Hashtable name = new Hashtable();
//索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
public string this[string index]
{
get { return name[index].ToString();
set { name.Add(index, value); }
}
}
public class Test
{
static void Main()
{
IndexerClass Indexer = new IndexerClass();
Indexer["A0001"] = "张三";
Indexer["A0002"] = "李四";
Console.WriteLine(Indexer["A0001"]);
Console.WriteLine(Indexer["A0002"]);
}
}
例3、 索引器的重载
public class IndexerClass
{
private Hashtable name = new Hashtable();
//1:通过key存取Values
public string this[int index]
{
get { return name[index].ToString(); }
set { name.Add(index, value); }
}
//2:通过Values存取key
public int this[string aName]
{
get
{
//Hashtable中实际存放的是DictionaryEntry(字典)类型,如果要遍历一个Hashtable,就需要使用到DictionaryEntry
foreach(DictionaryEntry d in name)
{
if (d.Value.ToString() == aName)
{
return Convert.ToInt32(d.Key);
}
}
return -1;
}
set
{
name.Add(value, aName);
}
}
}
public class Test
{
static void Main()
{
IndexerClass Indexer = new IndexerClass();
//第一种索引器的使用
Indexer[1] = "张三";//set访问器的使用
Indexer[2] = "李四";
Console.WriteLine("编号为1的名字:" + Indexer[1]);//get访问器的使用
Console.WriteLine("编号为2的名字:" + Indexer[2]);
Console.WriteLine();
//第二种索引器的使用
Console.WriteLine("张三的编号是:" + Indexer["张三"]);//get访问器的使用
Console.WriteLine("李四的编号是:" + Indexer["李四"]);
Indexer["王五"] = 3;//set访问器的使用
Console.WriteLine("王五的编号是:" + Indexer["王五"]);
}
}
例4:多参索引器。
using System;
using System.Collections;
//入职信息类
public class EntrantInfo
{
private string name; //姓名
private int number;// 编号
private string department;// 部门
public EntrantInfo()
{
}
public EntrantInfo(string name, int num, string department)
{
this.name = name;
this.number = num;
this.department = department;
}
public string Name
{
get { return name; }
set { name = value; }
}
public int Num
{
get { return number; }
set { number = value; }
}
public string Department
{
get { return department; }
set { department = value; }
}
}
//声明一个类EntrantInfo的索引器
public class IndexerForEntrantInfo
{
private ArrayList ArrLst;//用于存放EntrantInfo类
public IndexerForEntrantInfo()
{
ArrLst = new ArrayList();
}
//声明一个索引器:以名字和编号查找存取部门信息
public string this[string name, int num]
{
get
{
foreach (EntrantInfo en in ArrLst)
{
if (en.Name == name && en.Num == num)
{
return en.Department;
}
}
return null;
}
set
{
//new关键字:C#规定,实例化一个类或者调用类的构造函数时,必须使用new关键
ArrLst.Add(new EntrantInfo(name, num, value));
}
}
//声明一个索引器:以编号查找名字和部门
public ArrayList this[int num]
{
get
{
ArrayList temp = new ArrayList();
foreach (EntrantInfo en in ArrLst)
{
if (en.Num == num)
{
temp.Add(en);
}
}
return temp;
}
}
//还可以声明多个版本的索引器...
}
public class Test
{
static void Main()
{//this[string name, int num]的使用
IndexerForEntrantInfo Info = new IndexerForEntrantInfo();
Info["张三", 101] = "人事部";
Info["李四", 102] = "行政部";
Console.WriteLine(Info["张三", 101]);
Console.WriteLine(Info["李四", 102]);
Console.WriteLine();
foreach (EntrantInfo en in Info[102]) //this[int num]的使用
{
Console.WriteLine(en.Name);
Console.WriteLine(en.Department);
}
}
}
例5、摘苹果放到篮子里。
enum Color
{
Red,
Green
}
class Apple
{
public Color c;
}
class Peson
{
private string name;
public Apple PickUp()
{
Apple apple = new Apple();
apple.c = Color.Red;
return apple;
}
}
class Basket
{
private Apple[] apples = new Apple[5];
public Apple this[int n]
{
get { return apples[n]; }
set { apples[n] = value; }
}
private byte length = 0;
public void Add(Apple apple)
{
if (length < 5)
{
this[length] = apple;
Console.WriteLine("篮子里有{0}个苹果。",length+1);
length++;
}
else
{
Console.WriteLine("放满了!!");
}
}
}
class Program
{
static void Main(string[] args)
{
Peson person = new Peson();
Apple ap = person.PickUp();
Basket basket = new Basket();
basket.Add(ap);
basket.Add(ap);
basket.Add(ap);
basket.Add(ap);
basket.Add(ap);
}
}
文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。
原文链接:wanghao.blog.csdn.net/article/details/105481478
- 点赞
- 收藏
- 关注作者
评论(0)