2016-07-07 84 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.Coefficients [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

不知道。我贊成你。問題對我來說似乎很清楚。也許研究得不是很好,因爲它是一個基本的語言語法問題,但仍然是有效的國際海事組織。 – 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>中用於訪問類中使用的內部數組,並返回指定索引處的元素(set或get)。該功能稱爲Indexer

爲了測試自己,嘗試創建具有相同簽名的方法:

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

你會得到一個編譯錯誤:

錯誤CS0082:類型「MyClass的」已經儲備了成員稱爲 具有相同參數類型的'get_Item'

相關問題