wake-up-neo.com

Wie überlade ich den eckigen Klammeroperator in C #?

Mit DataGridView können Sie beispielsweise Folgendes ausführen:

DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];

aber für das Leben von mir kann ich die Dokumentation auf der Index/eckigen Klammer Operator nicht finden. Wie nennen sie es? Wo ist es implementiert? Kann es werfen? Wie kann ich dasselbe in meinen eigenen Klassen machen?

ETA: Danke für die schnellen Antworten. Kurz gesagt: Die entsprechende Dokumentation befindet sich unter der Eigenschaft "Item". Der Weg zur Überladung führt über die Deklaration einer Eigenschaft wie public object this[int x, int y]{ get{...}; set{...} }; Der Indexer für DataGridView wirft zumindest laut Dokumentation nicht. Es wird nicht erwähnt, was passiert, wenn Sie ungültige Koordinaten eingeben.

ETA Nochmals: OK, obwohl in der Dokumentation nichts erwähnt wird (freches Microsoft!), Stellt sich heraus, dass der Indexer für DataGridView tatsächlich eine ArgumentOutOfRangeException auslöst, wenn Sie ungültige Koordinaten angeben. Faire Warnung.

235
Coderer

sie können finden, wie es geht hier . Kurz gesagt ist es:

public object this[int i]
{
    get { return InnerList[i]; }
    set { InnerList[i] = value; }
}

Wenn Sie nur einen Getter benötigen, können Sie auch die Syntax in Antwort unten verwenden (ab C # 6).

356
Ruben

Das wäre die Eigenschaft item: http://msdn.Microsoft.com/en-us/library/0ebtbkkc.aspx

Vielleicht würde so etwas funktionieren:

public T Item[int index, int y]
{ 
    //Then do whatever you need to return/set here.
    get; set; 
}
40
Operators                           Overloadability

+, -, *, /, %, &, |, <<, >>         All C# binary operators can be overloaded.

+, -, !,  ~, ++, --, true, false    All C# unary operators can be overloaded.

==, !=, <, >, <= , >=               All relational operators can be overloaded, 
                                    but only as pairs.

&&, ||                  They can't be overloaded

() (Conversion operator)        They can't be overloaded

+=, -=, *=, /=, %=                  These compound assignment operators can be 
                                    overloaded. But in C#, these operators are
                                    automatically overloaded when the respective
                                    binary operator is overloaded.

=, . , ?:, ->, new, is, as, sizeof  These operators can't be overloaded

    [ ]                             Can be overloaded but not always!

Informationsquelle

Für halterung:

public Object this[int index]
{

}

ABER

Der Array-Indizierungsoperator kann nicht überladen werden ; Typen können jedoch Indexer definieren, dh Eigenschaften, die einen oder mehrere Parameter annehmen. Indexer-Parameter werden wie Array-Indizes in eckige Klammern eingeschlossen, aber Indexer-Parameter können als beliebiger Typ deklariert werden (im Gegensatz zu Array-Indizes, die ein Ganzes sein müssen).

From MSDN

24
public class CustomCollection : List<Object>
{
    public Object this[int index]
    {
        // ...
    }
}
6

Informationen zu CLI C++ (kompiliert mit/clr) finden Sie unter dieser MSDN-Link .

Kurz gesagt, eine Eigenschaft kann den Namen "default" erhalten:

ref class Class
{
 public:
  property System::String^ default[int i]
  {
    System::String^ get(int i) { return "hello world"; }
  }
};
4
superjordo

Wenn Sie C # 6 oder höher verwenden, können Sie Ausdruckssyntax für den Nur-Abruf-Indexer verwenden:

public object this[int i] => this.InnerList[i];

4
amoss

In diesem Beispiel wird ein Wert aus einem internen List-Objekt zurückgegeben. Sollte dir die Idee geben.

  public object this[int index]
  {
     get { return ( List[index] ); }
     set { List[index] = value; }
  }
2
Rob Prouse

Wenn Sie den Array-Indexer meinen, überladen Sie dies, indem Sie eine Indexereigenschaft schreiben. Und Sie können Indexereigenschaften überladen (schreiben, so viele Sie möchten), solange jede eine andere Parametersignatur hat

public class EmployeeCollection: List<Employee>
{
    public Employee this[int employeeId]
    {   
        get 
        { 
            foreach(var emp in this)
            {
                if (emp.EmployeeId == employeeId)
                    return emp;
            }

            return null;
        }
    }

    public Employee this[string employeeName]
    {   
        get 
        { 
            foreach(var emp in this)
            {
                if (emp.Name == employeeName)
                    return emp;
            }

            return null;
        }
    }
}
1
Charles Bretana