Frage

Datagridview, zum Beispiel, können Sie dies tun:

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

, aber für das Leben von mir kann ich nicht in die Dokumentation auf dem Index / square-eckigen Klammern finden. Wie nennen sie es? Wo wird sie umgesetzt? Kann es werfen? Wie kann ich das gleiche tut in meiner eigenen Klasse?

ETA: Vielen Dank für die schnellen Antworten. Kurz: Die entsprechende Dokumentation ist unter der „Item“ Eigenschaft; die Art und Weise, um eine zu Überlastung ist durch eine Eigenschaft wie public object this[int x, int y]{ get{...}; set{...} } erklärt; der Indexer für Datagridview nicht werfen, zumindest nach der Dokumentation. Es muss nicht erwähnt, was passiert, wenn Sie ungültige Koordinaten liefern.

ETA wieder: OK, auch wenn die Dokumentation nicht erwähnt es macht (ungezogen Microsoft!), Es stellt sich heraus, dass der Indexer für Datagridview wird in der Tat eine ArgumentOutOfRangeException werfen, wenn Sie es mit ungültigen Koordinaten liefern. Eine faire Warnung.

War es hilfreich?

Lösung

Sie 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 die Syntax in beantworten unten auch verwendet werden kann (ausgehend von C # 6).

Andere Tipps

Das würde den Artikel Eigenschaft sein: http://msdn.microsoft.com /en-us/library/0ebtbkkc.aspx

Vielleicht wäre so etwas wie dies funktioniert:

public T Item[int index, int y]
{ 
    //Then do whatever you need to return/set here.
    get; set; 
}
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!

Quelle der Information

Für Halter:

public Object this[int index]
{

}

ABER

Der Array Indizierungsoperator kann nicht überlastet werden ; jedoch können Typen definieren Indexer, Eigenschaften, die einen oder mehr Parameter nehmen. Indexer Parameter sind in eckigen Klammern, wie Array-Indizes, aber Indexer Parameter können deklariert werden von jeder Art zu sein (im Gegensatz zu Array-Indizes, die integriert sein müssen).

MSDN

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

Für CLI C ++ (mit / clr kompiliert) finden Sie unter in diesem MSDN-Link .

Kurz gesagt, eine Eigenschaft kann den Namen "default" angegeben werden:

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

Wenn Sie C # 6 oder höher verwenden, können Sie die Expression-bodied Syntax für get-only Indexer verwenden:

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

Hier ist ein Beispiel Wert aus einem internen Liste Objekt zurück. Sollten Sie die Idee.

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

Wenn Sie das Array Indexer bedeuten ,, Sie überlasten, dass nur durch einen Indexer Eigenschaft zu schreiben .. Und Sie können überlasten, (so viele schreiben, wie Sie wollen) Indexer Eigenschaften solange jeder einen anderen Parameter Signatur

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;
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top