C #에서 대괄호 연산자를 어떻게 과부하합니까?
예를 들어 DataGridView를 사용하면 다음을 수행 할 수 있습니다.
DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];
그러나 내 인생에서 색인 / 대괄호 연산자에 대한 문서를 찾을 수 없습니다. 그들은 그것을 무엇이라고 부릅니까? 어디에서 구현됩니까? 던질 수 있습니까? 내 수업에서 어떻게 똑같은 일을 할 수 있습니까?
ETA : 모든 빠른 답변에 감사드립니다. 간단히 : 관련 문서는 "항목"속성에 있습니다. 오버로드하는 방법은 다음과 같은 속성을 선언하는 것입니다 public object this[int x, int y]{ get{...}; set{...} }
. 적어도 문서에 따르면 DataGridView의 인덱서는 throw되지 않습니다. 유효하지 않은 좌표를 제공하면 어떤 일이 발생하는지 언급하지 않습니다.
ETA 다시 : OK, 문서에서 언급하지 않았지만 (Microsoft가 아닙니다!) 잘못된 좌표를 제공하면 DataGridView의 인덱서에서 ArgumentOutOfRangeException이 발생합니다. 공정한 경고.
여기에서 방법을 찾을 수 있습니다 . 간단히 말해서 :
public object this[int i]
{
get { return InnerList[i]; }
set { InnerList[i] = value; }
}
게터 만 필요한 경우 아래 답변 의 구문을 사용할 수도 있습니다 (C # 6부터).
이것이 항목 속성이 될 것입니다 : 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]
{
}
그러나
배열 인덱싱 연산자 는 오버로드 될 수 없습니다 . 그러나 형식은 인덱서, 하나 이상의 매개 변수를 사용하는 속성을 정의 할 수 있습니다. 인덱서 매개 변수는 배열 인덱스와 마찬가지로 대괄호로 묶지 만 인덱서 매개 변수는 배열 인덱스와 달리 모든 유형으로 선언 할 수 있습니다 (배수 형이어야 함).
에서 MSDN
public class CustomCollection : List<Object>
{
public Object this[int index]
{
// ...
}
}
/ clr로 컴파일 된 CLI C ++에 대해서는 이 MSDN 링크를 참조하십시오 .
간단히 말해, 속성에 "default"라는 이름을 지정할 수 있습니다.
ref class Class
{
public:
property System::String^ default[int i]
{
System::String^ get(int i) { return "hello world"; }
}
};
C # 6 이상을 사용하는 경우 get-only indexer에 표현식 본문 구문을 사용할 수 있습니다.
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;
}
}
}
참고 URL : https://stackoverflow.com/questions/287928/how-do-i-overload-the-square-bracket-operator-in-c
'Programing' 카테고리의 다른 글
MySQL INSERT INTO 테이블 VALUES .. vs. INSERT INTO 테이블 SET (0) | 2020.04.11 |
---|---|
오토 매퍼 : 새 객체를 만들지 않고 속성 값 업데이트 (0) | 2020.04.10 |
콘솔에서 Rails SQL 로깅 비활성화 (0) | 2020.04.10 |
JavaScript에서 문자열을 부동 소수점으로 변환하는 방법은 무엇입니까? (0) | 2020.04.10 |
힘내 수정, 삭제 및 추적되지 않은 모든 파일을 추가 하시겠습니까? (0) | 2020.04.10 |