c#索引器的用法,初学索引器,原理都不懂..

2024-11-30 04:47:59
推荐回答(2个)
回答1:

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 = new SampleCollection();
stringCollection[0] = "Hello, World";
System.Console.WriteLine(stringCollection[0]);
}
}

索引器使得对象可按照与数组相似的方法进行索引。

get 访问器返回值。set 访问器分配值。

this 关键字用于定义索引器。

value 关键字用于定义由 set 索引器分配的值。

索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。

索引器可被重载。

索引器可以有多个形参,例如当访问二维数组时。

补充问题的回答:
c#中编译器会定义一个把所有的数据成员初始化成0(假、null)等的构造函数,这个默认构造函数确保了结构体在生成时被初始化。
而如果允许你自己定义默认构造函数,那么就存在着一种可能:你漏掉了某个成员没有初始化。这样一来会导致这个成员的值在被构造后处于未知的状态,这是C#所不允许的。

回答2:

第二个问题,结构的构造函数,除非不给结构定义构造函数,如果定义,就必须初始化此结构的所有属性,这个不矛盾。
我下面给你一个详细的例子,包括了你提的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;
}
}
}
}
}
}