【C#】我看索引器

前沿:

  索引器:索引器允许类或结构的实例就像数组一样进行索引。 索引器类似于属性,不同之处在于它们的访问器采用参数。

正文:

  在看索引器前,我们先看看C#的属性,面向对象设计和编程的重要原则之一就是数据封装,也就是我们在类中定义的字段永远不应该对外公开,假如我们定义了下面一个类

public class Employee
{
    public string Name;
    public int Age;
}

那么我们在外面可以很随意的破换一个Employee对象:

Employee e=new Employee();
e.Age=-1;

这里我们可以看出来,年龄为-1是不符合逻辑的,年龄一般只有自己知道,自己可以随便说出一个范围(小姐,你今年多大了?——————我18)。所以我们一般是会把字段定义为私有的,外部想要访问可以,我可以给你一个公开的方法,但我自己规定我的年龄范围,你只能在这个范围里面来猜测测。

  class Employee
    {
        private string name;
        private Int32 age;

        public void SetAge(Int32 value)
        {
            if (value < 0)
                throw new ArgumentOutOfRangeException("年龄不能为小于0");
            age = value;
        }

        public Int32 GetAge()
        {
            return age;
        }
    }

这样我们就实现了数据字段的封装,当你试图给字段提供一个不合理的数值时,就会抛出异常,但这里却多出了两个方法,也就是说我们不得不实现额外的方法来封装我们的字段。于是C#就提供了属性,额外的方法默认有编译器提供,我们只需要这样来定义就可以了

   public Int32 Age
        {
            get { return age; }
            set
            {
                if (value < 0)
                    throw new ArgumentOutOfRangeException("年龄不能小于0");

                age = value;
            }
        }

以上就是无参属性(为什么称为无参属性,是因为这里我们的get访问器方法是不接受参数的,我们直接返回特定的一个字段值),也就是我们经常定义的对象属性,既然有无参属性,那么随之对应的就应该是有参属性。

有参属性:(也就是索引器了)

  有参属性,他的get访问器可以接受一个或多个参数,set 访问器可以接受两个或多个参数:下面我们看一个例子,这个类允许以数组风格的语法来索引由这个类的一个实例维护的一个数组。  

 class SampleCollection<T>
    {
        // Declare an array to store the data elements.
        private T[] arr = new T[100];
        public T this[int i]
        {
            get
            {

                return arr[i];
            }
            set
            {
                arr[i] = value;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Declare an instance of the SampleCollection type.
            SampleCollection<string> stringCollection = new SampleCollection<string>();

            // Use [] notation on the type.
            stringCollection[0] = "Hello, World";
            System.Console.WriteLine(stringCollection[0]);
        }
    }

这里给出一个动态切换语言版本的一个实例

public class LanguageManager
    {
        private static LanguageManager instance = new LanguageManager();
        public static LanguageManager Instance { get { return instance; } }

        public IList<LangInfo> Langs { get; private set; }

        private LanguageManager()
        {
            Langs = new LangInfo[]
            {
                new LangInfo()
                {
                    Name = "中文",
                    Uri = new Uri(/Lang/zh-cn.xaml", UriKind.RelativeOrAbsolute),
                    CultureInfo = new System.Globalization.CultureInfo("zh-cn"),
                },
                new LangInfo()
                {
                    Name="English",
                    Uri = new Uri("、Lang/en-us.xaml", UriKind.RelativeOrAbsolute),
                    CultureInfo = new System.Globalization.CultureInfo("en-us"),
                },
            };
        }

        public LangInfo this[string name]
        {
            get { return Langs.SingleOrDefault(l => l.Name == name); }
        }

        public LangInfo this[int i]
        {
            get { return Langs[i]; }
        }
    }
 Uri uri = LanguageManager.Instance[lang].Uri;

希望对你有一点点帮助(其实,有时候学习一个知识点是很容易的,关键是你要知道怎么用,以及什么场合下用就不容易了,还需要慢慢体会)!

【C#】我看索引器

时间: 2024-10-29 19:10:00

【C#】我看索引器的相关文章

用luke看索引

Luke是一个用于Lucene搜索引擎的第三方工具,它可以访问现有Lucene的索引,并允许您显示和修改.可以看每篇文档建立了哪些索引,验证有没有成功建立了索引.不然建立了,不能确定有没有成功. 可以用luke看文章怎么分的词.当搜索query过来以后,query也会被分词,拿这个分好的词去索引中查询.所以这个过程其实涉及到两次分词,既然做了索引,就是有可能两次分词用的分词器不一致. //必须先建索引 try { IndexWriter writer = new IndexWriter(INDE

接口、索引器、Foreach的本质(学习笔记)

接口 什么是接口? 接口代表一种能力,和抽象类类似但比抽象类的抽象程度更高! 接口的定义: 1 public interface IEat//定义一个接口 2 { 3 void Eat(string food);//为该接口定义一种能力 4 } 接口的定义 从上边的例子中我们可以看到,接口中的方法是没有方法体的甚至连访问修饰符都没有.而且在接口中只能有方法.属性.索引器及事件! 接口的使用: 1 public class Dog:IEat //Dog类实现IEat接口 2 { 3 //Dog类实

public animal this[int index]|索引器的使用

学习如何使用索引器,索引器的使用是public 类型 this[int index]{get{};set{}} ,访问通过类的实例(对象)加[i], 例如animal[i],就像访问数组一样,其实就是类的数组访问的使用书写. 使用详情请看msdn. 例子如下: class IndexerClass { private int[] arr = new int[100]; public int this[int index] // Indexer declaration { get { // Che

C#中常用的索引器

之前了解过索引器,当时还把索引器和属性给记混了, 以为索引器就是属性,下面写下索引器和属性的区别,以及怎么使用索引器 先说明一点,这里的索引器和数据库中的索引不一样,虽然都是找元素. 索引器和属性的区别: 属性是以名称来标识,而索引器是以函数的形式来标识(但是索引器不能完全理解为函数): 索引器可以被重载,而属性没有重载这一说法: 索引器不能声明为static,而属性可以: 还有一点就是索引很像数组,它允许一个对象可以像数组一样被中括号 [] 索引,但是和数组有区别,具体有: 数组的角标只能是数

C#语言进阶——3.C# 的索引器

简述:索引器为c#程序语言中类的一种成员,它使得对象可以像数组一样被索引,使程序看起来更直观,更容易编写. 1.C# 索引器的语法:介绍 C# 语言中的索引器的语法,如何建立一个索引器,以及索引器在语义上的正确使用. 1 class Program 2 { 3 4 private const string FILE_NAME = "Test.txt"; //文件名 5 static void Main(string[] args) 6 { 7 var names = new Index

索引器与迭代器

前一阵子在改一个项目bug,里边有这样一个功能.具体是这个样子: 功能里有一个由名字(string)组成的array[]数组,现在因为客户那里的人员调动我要把名字为“张三”的人去掉. 第一时间想到的是直接接着对数组进行操作,因为数组的长度不能改变,就零件了一个数组array2[array[].length-1]来保存出去张三后的array[]的数据. 公司的老人路过的时候问我为什么不直接用List进行操作,于是有了下面的转换代码: User[] tempList = new User[desig

C# 类中索引器的使用二

索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便.直观的被引用.索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.定义了索引器的类可以让您像访问数组一样的使用 [ ] 运算符访问类的成员.(当然高级的应用还有很多,比如说可以把数组通过索引器映射出去等等) 本文只是简单演示一下索引器的概念和基本的使用方法: 请看代码,下面是类的定义,中间包含了一个索引器定义 类的定义 public class Person { //

C#基础回顾(三)—索引器、委托、反射

一.前言 ------人生路蜿蜒曲折,独自闯荡 二.索引器 (1)定义: 索引器是一种特殊的类成员,它能够让对象以类似数组的形式来存取,使程序看起来更为直观,更容易编写. 定义形式如下: [修饰符] 数据类型 this[索引类型 index] { get{//获得属性的代码} set{//设置属性的代码} } 其中,修饰符包括:public,protected,private,internal,new,virtual,sealed,override, abstract,extern. (2)实现

【.net 深呼吸】细说CodeDom(7):索引器

在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参数.除了这个类,还可以使用 CodeArgumentReferenceExpression 类,这个类是专为方法参数引用而设计,其实用起来也和变量引用一样.请看看下面的例子. CodeMemberMethod m = new CodeMemberMethod(); m.Name = "Test&qu