c#索引器的用法,初学索引器,原理都不懂..
最好有一段示例代码,代码的内容最好是(一个类中定义一个索引器(数组类型的),然后用Main方法测试..).加上详细解释,以及原理....谢谢啦...在问一个问题,关于结构...
最好有一段示例代码,代码的内容最好是(一个类中定义一个索引器(数组类型的),然后用Main方法测试..).加上详细解释,以及原理....谢谢啦...
在问一个问题,关于结构的,C#总是提供给结构一个无参的构造函数,但是不可以有默认构造函数,这句话不矛盾吗? 这个应该怎么理解呢? 展开
在问一个问题,关于结构的,C#总是提供给结构一个无参的构造函数,但是不可以有默认构造函数,这句话不矛盾吗? 这个应该怎么理解呢? 展开
2个回答
展开全部
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#所不允许的。
{
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#所不允许的。
展开全部
第二个问题,结构的构造函数,除非不给结构定义构造函数,如果定义,就必须初始化此结构的所有属性,这个不矛盾。
我下面给你一个详细的例子,包括了你提的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;
}
}
}
}
}
}
我下面给你一个详细的例子,包括了你提的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类一样的特性,也是一个能装载数据的集合,这样说明白么?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询