c#语言基础(4)----索引器
2008-11-26 14:07
501 查看
索引器也叫称为:参数化成员属性,就像成员属性一样,它在类中申明,个体中可以和属性一样获取和设置, 但和属性不同的地方:可以接受一个或者多个参数,而且使用this作为索引器名。注意:索引器不能使用static修饰,因为索引器只适用于实例。作用:提供了一种访问途径,访问一个存在实例中的集合的途径一个类可以有多个索引器,但是他的签名必须不同(这里说的是索引的参数类型应该不同)
下面是一个索引的简单例子:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
#region testClass
class Person
{
private string name;
public string Name
{
get { return name; }
}
private int age;
public int Age
{
get { return age; }
}
private string title;
public string Title
{
get { return title; }
}
public override string ToString()
{
if (title == null)
{
return "我叫"+name +" ,我今年 "+age +"岁了!";
}
else
{
return "我叫" + name + ", 我是" + title + " , " + age+"岁了";
}
}
public Person(string name, int age)
{
this.age = age;
this.name = name;
}
public Person(string name, int age, string title)
: this(name, age)
{
this.title = title;
}
}
#endregion
#region IndexerClass
class PersonCollection {
//建立一个对象集合
private System.Collections.ArrayList personArrayList = new System.Collections.ArrayList();
public Person this[int index]
{
get
{
//索引不能超出上下界限
if (!(index < 0 || index > personArrayList.Count - 1))
{
return personArrayList[index] as Person;
}
else
{
return null;
}
}
set
{
personArrayList.Insert(index, value);
}
}
//这里补充了一个根据人名字返回集合中第一个人的实例,如果名字不存在返回null
public Person this[string name]{
get{
foreach(Person p in personArryList){
if(p.Name==name){
return p;
}
rerurn null;
}
}
}
//返回集合中的对象数量
public int Count
{
get
{
return personArrayList.Count;
}
}
public override string ToString()
{
System.Text.StringBuilder s = new System.Text.StringBuilder(string.Format("我们家{0}个人/n",this.Count));
foreach (Person p in personArrayList)
{
s.Append(p.ToString()+"/n");
}
return s.ToString();
}
}
#endregion
#region Test
class test
{
static void Main()
{
PersonCollection home = new PersonCollection();
home[0] = new Person("张三", 34, "爸爸");
home[1] = new Person("李四", 32, "妈妈");
home[2] = new Person("张五", 12);
Console.WriteLine(home[0].ToString());
Console.WriteLine(home[1].ToString());
Console.WriteLine(home[2].ToString());
Console.WriteLine(home["张三"].ToString()); Console.ReadKey();
Console.WriteLine(home.ToString());
Console.ReadKey();
}
}
#endregion
}
下面是软件官方的例子的代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
//将文件字节数组访问类
class FileByteArray
{
//访问该文件的基础流
System.IO.Stream stream;
public FileByteArray(string fileName)
{
stream = new System.IO.FileStream(fileName, System.IO.FileMode.Open);
}
//操作完关闭流
public void CloseStream()
{
stream.Close();
stream = null;
}
//对文件读写的索引器
public byte this[long index]
{
get
{
byte[] buffer = new byte[1];
stream.Seek(index, System.IO.SeekOrigin.Begin);
stream.Read(buffer, 0, 1);
return buffer[0];
}
set
{
byte[] buffer=new byte[1]{value};
stream.Seek(index, System.IO.SeekOrigin.Begin);
stream.Write(buffer, 0, 1);
}
}
public long Length
{
get
{
return stream.Seek(0, System.IO.SeekOrigin.End);
}
}
}
//测试的作用就是吧传入的根目录下的文件1.txt中的字节进行反转
public class test
{
static void Main(string[] args)
{
string fileName = "1.txt";
if (args.Length != 1)
{
Console.WriteLine("参数太多");
return;
}
if (!System.IO.File.Exists(fileName))
{
Console.WriteLine("文件不存在~");
return;
}
FileByteArray file = new FileByteArray(fileName);
long len = file.Length;
for (long i = 0; i < len/2;++i )
{
byte t;
t = file[i];
file[i] = file[len - i - 1];
file[i] = t;
}
file.CloseStream();
}
}
}
先就介绍这么多吧 更深的应用还在熟悉中~
下面是一个索引的简单例子:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
#region testClass
class Person
{
private string name;
public string Name
{
get { return name; }
}
private int age;
public int Age
{
get { return age; }
}
private string title;
public string Title
{
get { return title; }
}
public override string ToString()
{
if (title == null)
{
return "我叫"+name +" ,我今年 "+age +"岁了!";
}
else
{
return "我叫" + name + ", 我是" + title + " , " + age+"岁了";
}
}
public Person(string name, int age)
{
this.age = age;
this.name = name;
}
public Person(string name, int age, string title)
: this(name, age)
{
this.title = title;
}
}
#endregion
#region IndexerClass
class PersonCollection {
//建立一个对象集合
private System.Collections.ArrayList personArrayList = new System.Collections.ArrayList();
public Person this[int index]
{
get
{
//索引不能超出上下界限
if (!(index < 0 || index > personArrayList.Count - 1))
{
return personArrayList[index] as Person;
}
else
{
return null;
}
}
set
{
personArrayList.Insert(index, value);
}
}
//这里补充了一个根据人名字返回集合中第一个人的实例,如果名字不存在返回null
public Person this[string name]{
get{
foreach(Person p in personArryList){
if(p.Name==name){
return p;
}
rerurn null;
}
}
}
//返回集合中的对象数量
public int Count
{
get
{
return personArrayList.Count;
}
}
public override string ToString()
{
System.Text.StringBuilder s = new System.Text.StringBuilder(string.Format("我们家{0}个人/n",this.Count));
foreach (Person p in personArrayList)
{
s.Append(p.ToString()+"/n");
}
return s.ToString();
}
}
#endregion
#region Test
class test
{
static void Main()
{
PersonCollection home = new PersonCollection();
home[0] = new Person("张三", 34, "爸爸");
home[1] = new Person("李四", 32, "妈妈");
home[2] = new Person("张五", 12);
Console.WriteLine(home[0].ToString());
Console.WriteLine(home[1].ToString());
Console.WriteLine(home[2].ToString());
Console.WriteLine(home["张三"].ToString()); Console.ReadKey();
Console.WriteLine(home.ToString());
Console.ReadKey();
}
}
#endregion
}
下面是软件官方的例子的代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
//将文件字节数组访问类
class FileByteArray
{
//访问该文件的基础流
System.IO.Stream stream;
public FileByteArray(string fileName)
{
stream = new System.IO.FileStream(fileName, System.IO.FileMode.Open);
}
//操作完关闭流
public void CloseStream()
{
stream.Close();
stream = null;
}
//对文件读写的索引器
public byte this[long index]
{
get
{
byte[] buffer = new byte[1];
stream.Seek(index, System.IO.SeekOrigin.Begin);
stream.Read(buffer, 0, 1);
return buffer[0];
}
set
{
byte[] buffer=new byte[1]{value};
stream.Seek(index, System.IO.SeekOrigin.Begin);
stream.Write(buffer, 0, 1);
}
}
public long Length
{
get
{
return stream.Seek(0, System.IO.SeekOrigin.End);
}
}
}
//测试的作用就是吧传入的根目录下的文件1.txt中的字节进行反转
public class test
{
static void Main(string[] args)
{
string fileName = "1.txt";
if (args.Length != 1)
{
Console.WriteLine("参数太多");
return;
}
if (!System.IO.File.Exists(fileName))
{
Console.WriteLine("文件不存在~");
return;
}
FileByteArray file = new FileByteArray(fileName);
long len = file.Length;
for (long i = 0; i < len/2;++i )
{
byte t;
t = file[i];
file[i] = file[len - i - 1];
file[i] = t;
}
file.CloseStream();
}
}
}
先就介绍这么多吧 更深的应用还在熟悉中~
相关文章推荐
- C#语言和数据库基础
- C#语言和数据库技术基础 ----------------- 第二章 简答二 、
- c#基础语言编程-集合
- 设计模式前传——面向对象基础(C#语言)
- C#语言基础——const、readonly和static
- 「基础」C#中的索引器
- C#语言基础回忆
- C#基础回顾(三)—索引器、委托、反射
- c#语言基础编程—string
- C#语言基础(三)
- C#语言基础(一)
- C#语言基础常见问题汇总
- c#语言基础
- 【备忘】C#语言基础-1
- C#语言学习--基础部分(十一) --值类型和引用类型
- C#语言学习--基础部分(十二) --堆,栈,装箱,拆箱,安全数据类型转换:as, is
- 使用C#作为Cocos2dx引擎脚本语言进行游戏开发——脚本运行时基础(二)
- C#语言基础常见问题汇总
- 【备忘】C#语言基础-2
- C#基础--索引器