2016-07-07 3 views
-2

Что происходит на самом деле здесь:Может кто-нибудь объяснить этот синтаксис C#?

public decimal[] Coefficients; 
public decimal this[int i] 
{ 
    get { return Coefficients[i]; } 
    set { Coefficients[i] = value; } 
} 

Что делает this служить? Это своего рода расширение до decimal?

+5

Если ваш класс называется MathTest, он позволяет вам получить доступ к массиву внутренних коэффициентов MathTest [i] вместо MathTest. Коэффициенты [i]. См. Http://stackoverflow.com/questions/1307354/c-sharp-indexer-usage и http://stackoverflow.com/questions/2185071/real-world-use-cases-for-c-sharp-indexers – ManoDestra

+1

Почему downvotes .. – PreqlSusSpermaOhranitel

+1

Идея. Я поддержал вас. Вопрос кажется мне достаточно ясным. Возможно, это довольно плохо изучено, так как это основной вопрос синтаксиса для lanuage, но все еще действительный IMO. – ManoDestra

ответ

11

Это Indexer.

Индексаторы позволяют индексировать экземпляры класса или структуры точно так же, как массивы. Индексаторы напоминают свойства, за исключением того, что их аксессоры принимают параметры.

Пример из связанного MSDN:

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

    // Define the indexer, which will allow client code 
    // to use [] notation on the class instance itself. 
    // (See line 2 of code in Main below.)   
    public T this[int i] 
    { 
     get 
     { 
      // This indexer is very simple, and just returns or sets 
      // the corresponding element from the internal array. 
      return arr[i]; 
     } 
     set 
     { 
      arr[i] = value; 
     } 
    } 
} 

// This class shows how client code uses the indexer. 
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]); 
    } 
} 
// Output: 
// Hello, World. 
2

Вы когда-нибудь задумывались над тем, как List<T>myList[i] работает в C# как массив?

Ответ на ваш вопрос. Синтаксис, который вы опубликовали, представляет собой синтаксический сахар, который компилятор преобразует в свойства, называемые get_Item(int index) и set_Item(int index, decimal value). Он используется в List<T>, например, для доступа к внутреннему массиву, используемому в классе, и возвращает элемент по указанному индексу (установить или получить). Эта функция называется Indexer.

Чтобы проверить себя, попробуйте создать метод с такой же подписью:

public decimal get_Item(int i) 
{ 
    return 0; 
} 

Вы получите ошибку компиляции:

Ошибка CS0082: Тип «MyClass» уже оставляет член называемый 'get_Item' с теми же параметрами