>  기사  >  백엔드 개발  >  C#의 인덱서에 대한 자세한 소개

C#의 인덱서에 대한 자세한 소개

黄舟
黄舟원래의
2017-05-07 10:32:491339검색

인덱서(Indexer)는 C#에서 도입한 새로운 형태의 클래스 멤버로, Object은 Array만큼 편리하고 직관적으로 에서 참조할 수 있습니다. 인덱서는 속성과 매우 유사하지만 인덱서는 매개변수 목록을 가질 수 있고 클래스에 직접 작용하지 않고 인스턴스 객체에만 작용할 수 있습니다. 인덱서를 정의하는 클래스를 사용하면 배열처럼 액세스할 수 있습니다. [ ] Operator는 클래스 멤버에 액세스합니다. (물론 인덱서를 통한 배열 매핑 등 고급 응용프로그램도 많이 있습니다.)

인덱서는 클래스나 구조체의 인스턴스를 배열처럼 인덱싱할 수 있도록 해줍니다. 인덱서는 해당 값이 ​​함수에서 매개 변수를 사용한다는 점을 제외하면 속성 과 유사합니다. 인덱서를 사용하면 클래스 또는 구조체의 인스턴스를 배열과 동일한 방식으로 인덱싱할 수 있습니다. 인덱서 액세스에 매개변수가 사용된다는 점을 제외하면 인덱서는 속성과 유사합니다.

인덱서 개요

  • 인덱서를 사용하여 배열과 같은 방식으로 개체를 인덱싱합니다.

  • get 함수는 값을 반환합니다.

    set 값 함수는 값을 할당합니다.

  • 인덱서를 정의하는 데 사용되는 키워드입니다.

  • 값 키워드는 집합 인덱서에서 할당한 값을 정의하는 데 사용됩니다.

  • 인덱서는

    정수 값을 기반으로 인덱싱할 필요가 없습니다. 특정 조회 메커니즘을 정의하는 것은 사용자의 몫입니다.

  • 인덱서는

    오버로드될 수 있습니다.

  • 인덱서는

    2차원 배열에 액세스할 때와 같이 여러 형식 매개변수를 가질 수 있습니다.

인덱서 및 배열 비교:

(1) 인덱서의 인덱스 값(Index) 종류는 제한되지 않는다

(2) 인덱서는 오버로딩을 허용한다

(3) 인덱서는 변수가 아닙니다

인덱서 차이점 속성에서

(1) 속성은 이름으로 식별되고 인덱서는 함수로 식별됩니다

(2) 인덱서는 오버로드될 수 있지만 속성은 불가능합니다.

(3) 인덱서는 정적, 속성은

간단한 인덱서 예시

using System;
using System.Collections;

public class IndexerClass
{
    private string[] name = new string[2];

    //索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
    public string this[int index]
    {
        //实现索引器的get方法
        get
        {
            if (index < 2)
            {
                return name[index];
            }
            return null;
        }

        //实现索引器的set方法
        set
        {
            if (index < 2)
            {
                name[index] = value;
            }
        }
    }
}
public class Test
{
    static void Main()
    {
        //索引器的使用
        IndexerClass Indexer = new IndexerClass();
        //“=”号右边对索引器赋值,其实就是调用其set方法
        Indexer[0] = "张三";
       Indexer[1] = "李四";
        //输出索引器的值,其实就是调用其get方法
        Console.WriteLine(Indexer[0]);
       Console.WriteLine(Indexer[1]);
    }
}

일 수 있습니다.
인덱서에 액세스하려면 문자열 을 첨자로 사용하세요

public class IndexerClass
{
    //用string作为索引器下标的时候,要用Hashtable
    private Hashtable name = new Hashtable();

    //索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
    public string this[string index]
    {
        get { return name[index].ToString(); 
        set { name.Add(index, value); }
    }
}
public class Test
{
    static void Main()
    {
        IndexerClass Indexer = new IndexerClass();
        Indexer["A0001"] = "张三";
        Indexer["A0002"] = "李四";
        Console.WriteLine(Indexer["A0001"]);
        Console.WriteLine(Indexer["A0002"]);
    }
}

인덱서 오버로딩

public class IndexerClass
{
    private Hashtable name = new Hashtable();

    //1:通过key存取Values
    public string this[int index]
    {
        get { return name[index].ToString(); }
        set { name.Add(index, value); }
    }

    //2:通过Values存取key
    public int this[string aName]
    {
        get
        {
            //Hashtable中实际存放的是DictionaryEntry(字典)类型,如果要遍历一个Hashtable,就需要使用到DictionaryEntry
            foreach(DictionaryEntry d in name)
            {
                if (d.Value.ToString() == aName)
                {
                    return Convert.ToInt32(d.Key);
                }
            }
            return -1;
        }
        set
        {
            name.Add(value, aName);
        }
    }
}
public class Test
{
    static void Main()
    {
        IndexerClass Indexer = new IndexerClass();

        //第一种索引器的使用
        Indexer[1] = "张三";//set访问器的使用
        Indexer[2] = "李四";
       Console.WriteLine("编号为1的名字:" + Indexer[1]);//get访问器的使用
        Console.WriteLine("编号为2的名字:" + Indexer[2]);

        Console.WriteLine();
        //第二种索引器的使用
        Console.WriteLine("张三的编号是:" + Indexer["张三"]);//get访问器的使用
        Console.WriteLine("李四的编号是:" + Indexer["李四"]);
       Indexer["王五"] = 3;//set访问器的使用
        Console.WriteLine("王五的编号是:" + Indexer["王五"]);
    }
}

다중 매개변수 인덱서

using System;
using System.Collections;

//入职信息类
public class EntrantInfo
{
    //姓名、编号、部门
    private string name;
    private int number;
    private string department;
    public EntrantInfo()
    {

    }
    public EntrantInfo(string name, int num, string department)
    {
        this.name = name;
        this.number = num;
        this.department = department;
    }

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public int Num
    {
        get { return number; }
        set { number = value; }
    }

    public string Department
    {
        get { return department; }
        set { department = value; }
    }
}

//声明一个类EntrantInfo的索引器
public class IndexerForEntrantInfo
{
    private ArrayList ArrLst;//用于存放EntrantInfo类
    public IndexerForEntrantInfo()
    {
        ArrLst = new ArrayList();
    }

    //声明一个索引器:以名字和编号查找存取部门信息
    public string this[string name, int num]
    {
        get
        {
            foreach (EntrantInfo en in ArrLst)
            {
                if (en.Name == name && en.Num == num)
                {
                    return en.Department;
                }
            }
            return null;
        }
        set
        {
            //new关键字:C#规定,实例化一个类或者调用类的构造函数时,必须使用new关键
            ArrLst.Add(new EntrantInfo(name, num, value));
        }
    }

    //声明一个索引器:以编号查找名字和部门
    public ArrayList this[int num]
    {
        get
        {
            ArrayList temp = new ArrayList();
            foreach (EntrantInfo en in ArrLst)
            {
                if (en.Num == num)
                {
                    temp.Add(en);
                }
            }
            return temp;
        }
    }

    //还可以声明多个版本的索引器...
}

public class Test
{
    static void Main()
    {
        IndexerForEntrantInfo Info = new IndexerForEntrantInfo();
        //this[string name, int num]的使用
        Info["张三", 101] = "人事部";
        Info["李四", 102] = "行政部";
        Console.WriteLine(Info["张三", 101]);
        Console.WriteLine(Info["李四", 102]);

        Console.WriteLine();

        //this[int num]的使用
        foreach (EntrantInfo en in Info[102])
        {
            Console.WriteLine(en.Name);
            Console.WriteLine(en.Department);
        }
    }
}

위 내용은 C#의 인덱서에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.