Object의 공용 메소드 설명:
공용 메소드:
Equals:
public class Object {
public virtual Boolean Equals(Object obj)
{
//두 개의 참조가 동일한 객체를 가리키는 경우 동일한 값을 포함해야 합니다
if (this == obj) return true;
return false;
}
}
this와 obj 인스턴스가 동일한 객체를 참조한다고 가정하면 true를 반환합니다. Equals는 객체가 자신과 동일한 값을 포함해야 한다는 것을 알고 있기 때문에 합리적으로 보입니다. 그러나 인스턴스가 다른 개체를 참조하는 경우 Equals는 개체에 동일한 값이 포함되어 있는지 확신할 수 없으므로 false를 반환합니다. 즉, Object Equals 메서드의 기본 구현에서 실제로 구현하는 것은 동일성이 아니라 동일성입니다.
Equals 메서드의 올바른 구현:
1. obj 실제 매개 변수가 null이면 false를 반환합니다. 왜냐하면 비정적 Equals 메서드를 호출할 때 이 메서드로 식별되는 현재 개체는 분명히 null이 될 수 없기 때문입니다
2. 및 obj 실제 매개변수가 동일한 객체를 참조하는 경우 true를 반환합니다. 이 단계는 많은 수의 필드가 포함된 객체를 비교할 때 성능을 향상시키는 데 도움이 될 수 있습니다. 3. this 및 obj 인수가 다른 유형의 객체를 참조하는 경우 false를 반환합니다. 문자열 객체는 분명히 FileStream 객체
4와 동일하지 않습니다. 유형으로 정의된 각 필드에 대해 이 객체의 값을 obj 객체의 값과 비교합니다. 필드가 동일하지 않으면 false
5를 반환합니다. 기본 클래스 호출 클래스의 Equals 메서드는 기본 클래스의 Equals 메서드가 false를 반환하면 false를 반환하고, 그렇지 않으면 true를 반환합니다.
참고:
신원 문제 테스트에서는 다음을 사용합니다. 프로토타입은 다음과 같습니다.
public static Boolean ReferenceEquals(Object objA, object objB)
{
return (objA==objB);
}
ID 문제를 확인하세요( 두 참조가 동일한 개체를 가리키는지 확인하세요. ReferenceEquals를 호출할 때 C#의 == 연산자를 사용하면 안 됩니다(두 피연산자가 먼저 Object로 변환되지 않는 한). 특정 피연산자의 형식이 오버로드될 수 있기 때문입니다. == 연산자이며 할당된 값은 ID와 의미가 다릅니다.
시스템. ValueType(모든 값 유형의 기본 클래스)은 Object의 Equals 메서드를 재정의하고 올바른 구현을 구현하여 값의 동일성 확인(신원 확인 대신)을 수행합니다. ValueType의 Equals 내부 구현은 다음과 같습니다.
1, if obj 실제 매개변수가 null이면 false
2를 반환합니다. 이 매개변수와 obj 실제 매개변수가 다른 유형의 객체를 참조하는 경우 false
3을 반환합니다. 유형에 의해 정의된 각 인스턴스 필드에 대해 이 객체의 값을 obj 값과 비교합니다. 객체의 비교가 이루어집니다(신원 확인 대신). Equals of ValueType의 내부 구현은 다음과 같습니다.
1, obj 실제 매개변수가 null이면 false를 반환합니다.
2, 이 매개변수와 obj 실제 매개변수가 서로 다른 유형의 개체를 참조하는 경우 false를 반환합니다.
3, 다음에 대해 정의됨 각 인스턴스 필드에 대해 이 객체의 값은 (필드의 equals 메소드를 호출하여) obj 객체의 값과 비교됩니다. 필드가 동일하지 않으면 false
4가 반환되고 true가 반환됩니다. 반환됩니다. ValueType의 Equals 메서드는 Object의 Equals 메서드를 호출하지 않습니다.
내부적으로 ValueType의 Equals 메서드는 리플렉션을 사용하여 위의 3단계를 완료합니다. 느린 CLR 리플렉션 메커니즘으로 인해 자체 값 형식을 정의할 때 Equals를 재정의해야 합니다. 메서드를 사용하여 동일성 비교를 위한 자체 유형의 성능을 향상시킵니다. 물론 구현에서는 base.Equals를 호출하지 않습니다.
참고:
자신만의 유형을 정의할 때 재정의된 Equals는 다음을 준수해야 합니다. 평등의 네 가지 특성
1, Equalse는 반사적이어야 합니다. x.Equals(x)는 true를 반환해야 합니다
2, Equals는 대칭이어야 합니다. x.Equals(y) 및 y.Equals(x)는 동일한 값을 반환합니다
3, Equals는 전이적이어야 합니다. x.Equals(y)는 true를 반환하고, y.Equals(z)는 true를 반환하며, x.Equals(z)는 확실히 true를 반환합니다
4, Equals는 일관성이 있어야 합니다. 두 값을 비교하는 것은 변경되지 않고 Equals의 반환 값도 변경되지 않습니다
GetHashCode:
정의한 클래스가 Equals 메서드를 재정의하는 경우 GetHashCode 메서드도 재정의해야 합니다. 이 요구 사항이 필요한 이유는 System.Collections.Hashtable 형식, System.Collection.Generic.Dictionary 형식 및 일부 다른 컬렉션을 구현하려면 두 개체가 동일한 것으로 간주되기 위해 동일한 해시 코드를 가져야 하기 때문입니다. 따라서 Equals를 다시 작성하는 경우 동등 알고리즘과 개체 해시 코드 알고리즘의 일관성을 보장하기 위해 GetHashCode를 다시 작성해야 합니다. 간단히 말해서 키/값 쌍을 컬렉션에 추가하려면 먼저 개체의 해시 코드를 얻어야 합니다. 해시 코드는 키/값 쌍이 저장되어야 하는 해시 버킷을 나타냅니다. 컬렉션이 키를 조회해야 하는 경우 지정된 키 개체의 해시 코드를 얻습니다. 이는 이제 순차적으로 검색할 해시 버킷을 식별하며, 여기서 지정된 키 개체와 동일한 키 개체를 찾습니다. . 이 알고리즘을 사용하여 키를 저장하고 조회한다는 것은 컬렉션의 키 개체가 수정되면 컬렉션에서 더 이상 개체를 찾을 수 없음을 의미합니다. 따라서 해시 테이블에서 키 개체를 수정해야 하는 경우 올바른 접근 방식은 원래 키/값 쌍을 제거하고 키 개체를 수정한 다음 새 키/값 쌍을 해시 테이블에 다시 추가하는 것입니다.
GetHashCode 메서드를 사용자 정의하는 것은 어렵지 않을 수 있지만 데이터 유형 및 데이터 분포에 따라 다릅니다. 예와 규칙이 아래에 나와 있습니다.
내부 봉인 클래스 Point
{
private readonly Int32 m_x, m_y;
public override int GetHashCode()
{
return m_x ^ m_y; //m_x와 m_y의 XOR 결과를 반환합니다
}
}
규칙:
1. 이 알고리즘은 해시 테이블이 최상의 성능을 얻을 수 있도록 좋은 무작위 분포를 제공해야 합니다.
2. 누적된 GetHashCode 메서드를 알고리즘에서 호출하고 해당 반환 값을 포함할 수 있습니다. 그러나 일반적으로 Object 또는 ValueType의 GetHashCode 메서드를 호출하지 마세요. 둘 다 구현하는 것은 고성능 해싱 알고리즘과 관련이 없기 때문입니다
3. 알고리즘 실행 속도는 가능한 한 빨라야 합니다
4. 동일한 값은 동일한 해시 값을 반환해야 합니다. 예를 들어 동일한 텍스트를 포함하는 두 개의 문자열 개체는 동일한 해시 코드
5를 반환합니다. System.Object에 의해 구현된 GetHashCode 메서드는 파생 형식 및 기타 필드에 대해 아무것도 모르므로 수명 동안 변경되지 않는 값을 반환합니다. 개체의 일련번호입니다.
ToString:
기본 반환 유형은 전체 이름(this.GetType().FullName)입니다.
GetType:
Type에서 파생된 유형의 인스턴스를 반환하여 GetType이 호출되었을 때 객체의 유형을 나타냅니다. 반환된 Type 객체를 리플렉션 클래스와 함께 사용하여 객체 유형과 관련된 메타데이터 정보를 얻을 수 있습니다. 또한 GetType은 가상이 아닌 메서드입니다. 그 목적은 클래스가 메서드를 재정의하고 엔터프라이즈 유형을 숨겨서 형식 안전성을 파괴하는 것을 방지하는 것입니다.
Protected 메서드:
MemberwiseClone:
이 비가상 메서드는 클래스의 새 인스턴스를 생성하고 정적 개체의 인스턴스 필드를 이 개체의 인스턴스 필드와 정확히 동일하게 설정합니다. 새 인스턴스에 대한 참조를 반환합니다.
Finalize:
이 가상 메서드는 가비지 수집기가 개체가 가비지로 재활용되었다고 판단한 후 개체의 메모리가 실제로 재활용되기 전에 호출됩니다. 재활용하기 전에 정리 작업을 수행해야 하는 형식은 이 메서드를 재정의해야 합니다.
위 내용은 System.Object란 무엇입니까? System.Object를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!