class SampleCollection
{
private T[] arr = new T[100];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}
// This class shows how client code uses the indexer
class Program
{
static void Main(string[] args)
{
SampleCollection
stringCollection[0] = "Hello, World";
System.Console.WriteLine(stringCollection[0]);
}
}
索引器使得对象可按照与数组相似的方法进行索引。
get 访问器返回值。set 访问器分配值。
this 关键字用于定义索引器。
value 关键字用于定义由 set 索引器分配的值。
索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。
索引器可被重载。
索引器可以有多个形参,例如当访问二维数组时。
补充问题的回答:
c#中编译器会定义一个把所有的数据成员初始化成0(假、null)等的构造函数,这个默认构造函数确保了结构体在生成时被初始化。
而如果允许你自己定义默认构造函数,那么就存在着一种可能:你漏掉了某个成员没有初始化。这样一来会导致这个成员的值在被构造后处于未知的状态,这是C#所不允许的。
第二个问题,结构的构造函数,除非不给结构定义构造函数,如果定义,就必须初始化此结构的所有属性,这个不矛盾。
我下面给你一个详细的例子,包括了你提的2个问题,都有注释,有什么问题Hi我。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Student s1 = new Student(18, "张三");
Student s2 = new Student(17,"李四");
StudentList sl = new StudentList();
sl.Add(s1);
sl.Add(s2);
//调用索引器
Console.WriteLine("我叫{0},今年{1}岁",sl["张三"].name,sl["张三"].age);
Console.ReadKey();
}
}
///
/// 定义一个结构,学生
///
public struct Student
{
public int age; //年龄
public string name; //姓名
//构造函数,除非不定义,如果定义就必须初始化全部属性
public Student(int age, string name)
{
this.age = age;
this.name = name;
}
}
///
/// 定义一个列表
///
public class StudentList : List
{
///
/// 定义一个索引器,按名称查找
///
/// 参数:名字
///
public Student this[string name]//这里注意,参数不一定要是字符串,也可以是其他类型,比如也可以按年龄查找等等。
{
get
{
//遍历所有学生
foreach (Student ms in this)
{
//找到了名字为name值的学生,返回此学生
if (ms.name == name)
{
return ms;
}
}
//default函数用来返回一个类型的默认值,不用深究。
return default(Student);
}
set
{
//遍历所有学生
for (int i = 0; i < this.Count(); i++)
{
//找到了名字为name值的学生,给这个学生重新赋值。
Student ms = this[i];
if (ms.name == name)
{
ms = value;
}
}
}
}
}
}