C #에서 인덱서를 사용하는 방법

C # 프로그래밍 언어에는 개체를 배열처럼 사용할 수있는 기능인 인덱서에 대한 지원이 포함되어 있습니다. 인덱서는 스마트 배열이라고도하며 속성을 정의하는 방법과 유사하게 정의 할 수 있습니다. MSDN은 "인덱서는 클래스 또는 구조체의 인스턴스가 배열처럼 인덱싱되도록 허용합니다. 인덱서는 접근자가 매개 변수를 사용한다는 점을 제외하면 속성과 유사합니다."

인덱서와 속성은 여러면에서 유사하지만 미묘한 차이가 있습니다. 속성과 달리 인덱스를 사용하여 인덱서에 액세스 할 수 있습니다. 이름을 사용하여 속성에 액세스해야합니다. 또한 인덱서는 클래스의 인스턴스 멤버이므로 정적 일 수 없습니다. 정적 및 비 정적 속성을 모두 가질 수 있습니다.

다음 코드 스 니펫은 인덱서가 선언되는 방법을 보여줍니다.

this [argument list]

{

  get

  {

  }

  Set

  {

  }

}

인덱서의 구문 선언에 표시된 수정자는 private, public, protected 또는 internal 일 수 있습니다.

다음 클래스를 고려하십시오.

public class Contact

    {

        private string[] address = new string[3];

        public string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

Contact 클래스는 address라는 개인 멤버를 포함하며 인덱서를 정의합니다. 주소 멤버는 문자열 유형의 배열입니다. Contact 클래스의 인스턴스를 만들고 인덱서를 사용하는 방법은 다음과 같습니다.

Contact contact = new Contact();

 contact[0] = "Begumpet";

 contact[1] = "Hyderabad";

 contact[2] = "Telengana";

for (int i = 0; i < 3; i++)

Console.WriteLine (contact[i]);

인덱서를 정의하려면 "this"키워드를 사용해야합니다. 인덱서에 액세스하기위한 인덱스로 정수만 사용하도록 제한되지는 않습니다. 다른 조회 메커니즘도 사용할 수 있습니다. 인덱서는 일반적으로 클래스가 컬렉션 또는 개체를 나타낼 때 사용됩니다. 그런 다음 인덱서를 사용하여 인덱스를 사용하여 특정 요소에 액세스 할 수 있습니다.

예를 들어 보겠습니다. Customer라는 다음 클래스를 고려하십시오.

public class Customer

    {

       public List Orders

        {

            get; set;

        }

       public Order this[int orderID]

        {

            get

            {

                return (from o in Orders

                        where o.OrderID == orderID

                        select o).First();

            }

        }

    }

Customer 클래스는 Order 유형의 인덱서를 정의합니다. 또한 Order 유형 목록 인 공용 속성을 포함합니다. 참고로 주문 클래스는 다음과 같습니다.

public class Order

    {

        public int OrderID

        {

            get; set;

        }

    }

다음 코드 스 니펫은 특정 주문을 검색하기 위해 Customer 클래스의 인덱서에 액세스하는 방법을 보여줍니다.

   List lstOrder = new List();

  Order o1 = new Order();

  o1.OrderID = 1;

  Order o2 = new Order();

  o2.OrderID = 2;           

  lstOrder.Add(o1);

  lstOrder.Add(o2);

  Customer customer = new Customer();

  customer.Orders = lstOrder;

  Order o = customer[1];

위의 코드 스 니펫을 참조하십시오. Order 유형의 일반 목록이 생성되고 Customer 클래스 인스턴스의 Orders 속성에 할당 된 방법을 확인합니다. 다음으로 OrderId를 매개 변수로 전달하여 특정 주문 인스턴스를 검색합니다.

인덱서는 상속을 지원하고 다형성 일 수 있으며 추상적 일 수도 있습니다. 가상 인덱서를 정의하는 다음 클래스를 고려하십시오. ContactBase 클래스는이 문서의 앞부분에서 설명한 Contact 클래스의 수정 된 버전입니다.

 public class ContactBase

    {

        protected string[] address = new string[3];

        public virtual string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

이제 ContactBase 클래스에서 클래스를 파생시키고 아래와 같이 인덱서를 재정의 할 수 있습니다.

public class ConcreteContact: ContactBase

    {

       public override string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

따라서 위의 코드 예제에서 유형을 상속하는 동안 인덱서를 사용하는 방법과 다형성 동작을 표시하는 방법을 살펴 보았습니다.

인덱서를 추상으로 정의 할 수도 있습니다. 이렇게하려면 추상 클래스를 만든 다음 인덱서를 그 안에 추상으로 정의해야합니다. ContactBase 클래스를 수정하고 인덱서를 추상으로 정의 해 보겠습니다. 이제 ContactBase 클래스의 수정 된 버전이 어떻게 표시되는지는 다음과 같습니다.

 public abstract class ContactBase

    {

        protected string[] address = new string[3];

        public abstract string this[int index]

        {

            get; set;

        }

}

어쨌든 ConcreteContact 클래스를 변경할 필요는 없습니다. 이제 인덱서를 활용하여 아래와 같이 ConcreteContact 클래스의 인스턴스에 문자열 값을 할당 할 수 있습니다.

ConcreteContact contact = new ConcreteContact();

contact[0] = "Begumpet";

contact[1] = "Hyderabad";

contact[2] = "Telengana";