たとえば、DataGridViewを使用すると、次のことができます。
DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];
しかし、私の人生では、インデックス/角括弧演算子のドキュメントは見つかりません。彼らはそれを何と呼んでいますか?どこに実装されていますか?投げられますか?自分のクラスで同じことを行うにはどうすればよいですか?
ETA:迅速な回答ありがとうございます。簡単に説明すると、関連するドキュメントは「アイテム」プロパティの下にあります。オーバーロードする方法は、public object this[int x, int y]{ get{...}; set{...} }
のようなプロパティを宣言することです。少なくともドキュメントによると、DataGridViewのインデクサーはスローしません。無効な座標を指定するとどうなるかは言及されていません。
ETA再び:わかりました、ドキュメントではそれについて言及していませんが(Microsoftのいたずら!)、DataGridViewのインデクサーは、無効な座標を指定するとArgumentOutOfRangeExceptionを実際にスローすることがわかりました。公正警告。
それがアイテムプロパティになります: http://msdn.Microsoft.com/en-us/library/0ebtbkkc.aspx
たぶんこのような何かが機能するでしょう:
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!
ブラケットの場合:
public Object this[int index]
{
}
配列インデックス演算子はオーバーロードできません;ただし、型は、1つ以上のパラメーターを受け取るプロパティであるインデクサーを定義できます。インデクサーパラメーターは、配列インデックスと同様に角かっこで囲まれていますが、インデクサーパラメーターは任意の型として宣言できます(配列インデックスは整数でなければなりません)。
MSDN から
public class CustomCollection : List<Object>
{
public Object this[int index]
{
// ...
}
}
CLI C++(/ clrでコンパイル)については、 このMSDNリンク を参照してください。
要するに、プロパティには「default」という名前を付けることができます。
ref class Class
{
public:
property System::String^ default[int i]
{
System::String^ get(int i) { return "hello world"; }
}
};
C#6以降を使用している場合は、get-onlyインデクサーに式を使用した構文を使用できます。
public object this[int i] => this.InnerList[i];
以下は、内部のListオブジェクトから値を返す例です。あなたにアイデアを与える必要があります。
public object this[int index]
{
get { return ( List[index] ); }
set { List[index] = value; }
}
配列インデクサーを意味する場合、インデクサープロパティを記述するだけでオーバーロードできます。また、それぞれが異なるパラメーターシグネチャを持つ限り、インデクサープロパティをオーバーロードできます(必要な数だけ書き込む)。
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;
}
}
}