2016년 12월 13일 화요일

C# 인덱서(Indexer)

그냥 개인적으로 reference 하기 위해 copy & paste 한 내용입니다. 자세한 내용은 아래 링크를 참고하세요.
: https://msdn.microsoft.com/ko-KR/library/6x16t2tx.aspx


용도가 뭘까 궁금해서 찾아봄.
그냥 배열 같이 사용하고 싶은 stroage class에 적용해서 사용하면 편할 듯.


 인덱서에서는 클래스나 구조체의 인스턴스를 배열처럼 인덱싱할 수 있습니다. 인덱서는 해당 접근자가 매개 변수를 사용한다는 점을 제외하면 속성과 유사합니다.


인덱서는 클라이언트 응용 프로그램에서 배열과 마찬가지 방식으로 액세스할 수 있는 클래스, 구조체 또는 인터페이스를 만들 수 있게 해 주는 편리한 구문입니다. 인덱서는 주로 내부 컬렉션 또는 배열을 캡슐화하기 위한 형식에서 가장 많이 구현됩니다. 예를 들어 24시간 동안 10번 기록되는 온도를 화씨로 나타내는 TempRecord라는 클래스가 있다고 가정합니다. 클래스에는 온도를 나타내는 float 형식의 "temps"라는 배열과 온도를 기록한 날짜를 나타내는 DateTime이 들어 있습니다. 이 경우 인덱서를 구현하면 클라이언트는 float temp = tr.temps[4] 대신 float temp = tr[4]로 TempRecord 인스턴스의 온도에 액세스할 수 있습니다. 인덱서 표기법은 클라이언트 응용 프로그램의 구문을 단순하게 할 뿐 아니라 클래스와 해당 클래스의 용도를 다른 개발자가 쉽게 이해할 수 있도록 합니다.
클래스나 구조체에 대한 인덱서를 선언하려면 다음 예제에서와 같이 this 키워드를 사용합니다.
public int this[int index]    // Indexer declaration  
{  
    // get and set accessors  
}  
  

그나마 그럴듯한 예제.

class TempRecord
{
    // Array of temperature values
    private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F, 
                                            61.3F, 65.9F, 62.1F, 59.2F, 57.5F };

    // To enable client code to validate input 
    // when accessing your indexer.
    public int Length
    {
        get { return temps.Length; }
    }
    // Indexer declaration.
    // If index is out of range, the temps array will throw the exception.
    public float this[int index]
    {
        get
        {
            return temps[index];
        }

        set
        {
            temps[index] = value;
        }
    }
}

class MainClass
{
    static void Main()
    {
        TempRecord tempRecord = new TempRecord();
        // Use the indexer's set accessor
        tempRecord[3] = 58.3F;
        tempRecord[5] = 60.1F;

        // Use the indexer's get accessor
        for (int i = 0; i < 10; i++)
        {
            System.Console.WriteLine("Element #{0} = {1}", i, tempRecord[i]);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();

    }
}
/* Output:
        Element #0 = 56.2
        Element #1 = 56.7
        Element #2 = 56.5
        Element #3 = 58.3
        Element #4 = 58.8
        Element #5 = 60.1
        Element #6 = 65.9
        Element #7 = 62.1
        Element #8 = 59.2
        Element #9 = 57.5
    */

 이렇도 사용 가능.

public Customer this[long id] => store.LookupCustomer(id);  
  


interface에서 인덱서를 선언할 수 있습니다. 인터페이스 인덱서의 접근자와 클래스 인덱서의 접근자는 다음과 같은 차이점이 있습니다.
  • 인터페이스 접근자는 한정자를 사용하지 않습니다.
  • 인터페이스 접근자에는 본문이 없습니다.
따라서 접근자의 목적은 인덱서가 읽기/쓰기, 읽기 전용 또는 쓰기 전용인지 여부를 나타내는 것입니다.


public interface ISomeInterface
{
    //...

    // Indexer declaration:
    string this[int index]
    {
        get;
        set;
    }
}


인덱서 특징은

  • 인덱서를 사용하면 배열과 유사한 방식으로 개체를 인덱싱할 수 있습니다.
  • get 접근자는 값을 반환합니다. set 접근자는 값을 할당합니다.
  • this 키워드는 인덱서를 정의하는 데 사용됩니다.
  • value 키워드는 set 인덱서에서 할당하는 값을 정의하는 데 사용됩니다.
  • 인덱서는 정수 값으로 인덱싱될 필요가 없으며, 특정 조회 메커니즘을 정의하는 방법을 결정해야 합니다.
  • 인덱서는 오버로드될 수 있습니다.
  • 예를 들어 인덱서는 2차원 배열에 액세스하는 경우 둘 이상의 정식 매개 변수를 사용할 수 있습니다.


인덱서는 속성과 비슷합니다. 다음 표에 나와 있는 차이점을 제외하면 접근자에 정의된 모든 규칙이 인덱서 접근자에도 적용됩니다.
Property인덱서
공용 데이터 멤버인 것처럼 메서드를 호출할 수 있습니다.개체 자체의 배열 표기법을 사용하여 개체의 내부 컬렉션 요소에 액세스할 수 있습니다.
단순한 이름을 통해 액세스할 수 있습니다.인덱스를 통해 액세스할 수 있습니다.
정적 또는 인스턴스 멤버가 될 수 있습니다.인스턴스 멤버여야 합니다.
속성의 get 접근자에는 매개 변수가 없습니다.인덱서의 get 접근자는 인덱서와 동일한 정식 매개 변수 목록을 가집니다.
속성의 set 접근자에는 명시적인 value 매개 변수가 포함됩니다.인덱서의 set 접근자는 value 매개 변수 외에도 인덱서와 동일한 정식 매개 변수 목록을 가집니다.
자동으로 구현된 속성이 있는 약식 구문을 지원합니다.약식 구문을 지원하지 않습니다.

댓글 없음:

댓글 쓰기