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

最好有一段示例代码,代码的内容最好是(一个类中定义一个索引器(数组类型的),然后用Main方法测试..).加上详细解释,以及原理....谢谢啦...在问一个问题,关于结构... 最好有一段示例代码,代码的内容最好是(一个类中定义一个索引器(数组类型的),然后用Main方法测试..).加上详细解释,以及原理....谢谢啦...
在问一个问题,关于结构的,C#总是提供给结构一个无参的构造函数,但是不可以有默认构造函数,这句话不矛盾吗? 这个应该怎么理解呢?
展开
 我来答
shucsrain
2011-04-25 · 贡献了超过1069个回答
知道答主
回答量:1069
采纳率:0%
帮助的人:188万
展开全部
class SampleCollection<T>
{
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<string> stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hello, World";
System.Console.WriteLine(stringCollection[0]);
}
}

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

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

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

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

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

索引器可被重载。

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

补充问题的回答:
c#中编译器会定义一个把所有的数据成员初始化成0(假、null)等的构造函数,这个默认构造函数确保了结构体在生成时被初始化。
而如果允许你自己定义默认构造函数,那么就存在着一种可能:你漏掉了某个成员没有初始化。这样一来会导致这个成员的值在被构造后处于未知的状态,这是C#所不允许的。
zhaozhekang110
推荐于2016-01-27 · TA获得超过1841个赞
知道小有建树答主
回答量:671
采纳率:0%
帮助的人:873万
展开全部
第二个问题,结构的构造函数,除非不给结构定义构造函数,如果定义,就必须初始化此结构的所有属性,这个不矛盾。
我下面给你一个详细的例子,包括了你提的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();
}
}

/// <summary>
/// 定义一个结构,学生
/// </summary>
public struct Student
{
public int age; //年龄
public string name; //姓名
//构造函数,除非不定义,如果定义就必须初始化全部属性
public Student(int age, string name)
{
this.age = age;
this.name = name;
}
}
/// <summary>
/// 定义一个列表
/// </summary>
public class StudentList : List<Student>
{
/// <summary>
/// 定义一个索引器,按名称查找
/// </summary>
/// <param name="name">参数:名字</param>
/// <returns>此名字的学生</returns>
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;
}
}
}
}
}
}
更多追问追答
追问
非常感谢啦,好像明白了许多,但是新的问题又来了,在Program类中,上面的代码里 先是实例化了两个“学生” 值类型对象, 
Student s1 = new Student(18, "张三");
Student s2 = new Student(17,"李四");
StudentList sl = new StudentList();
sl.Add(s1);
sl.Add(s2);
用sl.Add();这里我就不知道了?
class StudentList : List
List 集合加在那个StudentList 类名 :List
是什么意思呢?
追答
List是一个泛型类,用来装载限定类型的集合。
里的T就代表这个集合中装的数据的类型
比如List就代表这个集合只能装Student类型
: (冒号)是代表继承,也就是说StudentList 这个类将拥有和List类一样的特性,也是一个能装载数据的集合,这样说明白么?
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式