어떻게 개체 가상 메서드를 재정의하는 방법

C #에서 개체의 모든 클래스의 기본 클래스는 모든 구조와 클래스는 직접 또는 간접적으로 그것에서 파생됩니다. 이 통로는 # 개발자가 알고있는 모든 C의 앞에 말했지만, 나는 그 프로그래머의 일부는 심지어 우리가 사용 몰랐다하는 확실하지 않다 믿을 수 ToString을 , 같음GetHashCode 가상 개체 클래스의 방법, 우리는 그들을 위해 할 수 있습니다 재 작성. 종종 프로젝트 개발에 사용되는 것을 특징으로 할 수있다이 세 가지 가상 메소드를 다시 작성하지만, 대부분의 개발자는 오버라이드 (override) 할 수있는 세 개의 가상 방법에주의를 지불하지 않았지만, 달성하기 위해 자신의 방법을 쓸 수 있습니다.
그들은 세 가지를 다시 작성하는 방법을 여기에 구체적으로 설명 할 것이다. 자, 내가 기사의 모든 코드는 코드 세그먼트의 형태로 나타납니다 있도록이 문서는 무겁게 만 형태의 출현을 이해를 돕기 위해, 설계 사양 및 설계 요구 사항의 코드를 포함 할 것이라는 점을 주목해야한다.

제로, ToString

이 세 가지 방법 ToString이 간단하고 가장 일반적으로 사용되는 무시 무시된다. 그러나 일부 개발자들은 내가 이런 생각이 잘못이라고 여기입니다, 그래서 작은 의미의 ToString 메서드를 오버라이드 (override) 생각합니다. 우리가 기본적으로 반환되는 객체에 ToString를 호출 할 때 클래스의 완전한 이름은, 예를 들어, 우리는 문자열하는 System.IO.File을 반환하는 System.IO.File 객체에서이 메소드를 호출, 결과는 우리가 무슨 일이 종종 있습니다 은 결과를 원하는이 결과는 이해가되지 않습니다. 우리는 각 호출에 () User.ToString 때 우리가 원하는 결과를 얻을 수없는 후, ToString 메서드를 오버라이드 (override)하지 않는 경우, 예를 들어, 우리는 "XXX XX 세 올해"반환하는 사용자 클래스의 ToString 메서드를 재정의합니다. 따라서, 우리는 다시 작성해야, 우리는 쓸 수 있습니다.

public class User
{
    public int Id {get;set;}
    public string Name {get;set;}
    public int Age {get;set;}
    public string Sex {get;set;} 
    public override string ToString()
    {
        return $"{Name}今年{Age}岁!";
    }
}

다시 작성 후 우리는 우리가 출력에 원하는 것을 얻을 수 있습니다. ToString을 재정의하는 동안 우리가 원하는 것을 얻을 수 있지만, 우리는 어떤 경우에 단지 다음과 같은 세 가지 경우에 ToString을 다시 작성하기 전에 toString를 오버라이드 (override) 해, 할 수 없습니다

  1. 최종 사용자는 코드 개발자에 직면하고 있습니다;
  2. 로그에 기록 필요;
  3. IDE 디버그 출력.

우선 우리는 또한 일부 설계 사양을 따라야합니다 ToString 위의 세 가지 경우에, 이러한 설계 사양 마이크로 소프트는 정의되지 않지만, 개발자는 개발 과정에서 요약 :

  1. , 설명이 명확해야 짧아야 반환합니다 문자열 길이를 ToString;
  2. ToString 메서드 ""에서 반환하지 말고 널 (null)을 반환;
  3. ToString 메서드를 시작하고 예외해야에 대한 예외, 적시 캡처 및 처리를 던져하지 마십시오;
  4. 만약 또는 서식 요구 사항은, 다음은 ToString 메서드를 오버라이드 (override) 할 필요가 존재 (예 : 언어 등) 지역 문화의 존재의 반환 값;
  5. 다시 작성 후 ToString은 개체 인스턴스를 식별하는 고유 한 문자열을 반환해야합니다.

지금까지 우리는 이상의 설명 및 방법을 ToString 규칙을 다시 작성해야합니다. 상대적으로 개체 ToString 메서드 재정의를 말하기 가상 메소드는 말한다 규칙, 방법 및 실제 상황이 다시 작성할 수 있습니다을 따르지 내 앞에 개발자와 같은 부분에서 매우 간단한 재 작성이다.

A, 같음과 ReferenceEquals

두 객체의 C #의 참가가 결정되면, 두 가지 경우 총이다 : 양의 값의 결정은 동일 하거나 양자의 판정이 동일한 주소를 참조 . 우리는 피사체 판정 값을 필요로하는 통상의 상황에서의 유형 값과 같은, 개체 유형은 동일한 주소로의 기준점에 대해 결정된다. 참조 형 객체를 가리 키도록 사용된다 등호 동일한 어드레스의 여부를 판정한다. (가) Equals 메서드 재정의를 들어, 많은 개발자들이 쉽게 그렇게 생각하지만, 개발에 내가 하나 상세 한 설명합니다 다음, 프로그램에 매우 중요합니다 매우 중요한 세부 사항을 잊어 버리는 경향이있다.

  1. 받는 사람 같은과 동일한
    두 개체가 동일한 인스턴스에서 참조하는 경우 소위 같은 수단은, 우리는 두 객체가 정체성을 말할 것이다. C #에서, 또는 우리는 파생 된 클래스라는 클래스 객체 사용 ReferenceEquals 정적 메소드는 객체 사이의 동일성을 결정한다. 경우에 따라서 값이 부품 또는 두 개체의 값을 모두하지만, 참조 다른 동일하기 때문에 그러나 동일한 단지 같은 종류의, 우리는 또한 그들이 평등을 가지고 말할 수 있습니다. 예에서 살펴 보자,이 예는 평등을 다시 작성하여 두 개체의 평등을 달성하기 위해.

        class Program
     {
         static void Main(string[] args)
         {
             Student s1 = new Student
             {
                 Age = 12,
                 Id = 1,
                 Name = "小明"
             };
             Student s2 = new Student
             {
                 Age = 13,
                 Id = 1,
                 Name = "小明"
             };
             if (Student.ReferenceEquals(s1, s2))
             {
                 Console.WriteLine("是同一个学生");
             }
             else
             {
                 Console.WriteLine("不是同一个学生");
             }
             Console.Read();
         }
     }
    
     class Student
     {
         public int Id { get; set; }
         public string Name { get; set; }
         public int Age { get; set; }
         public static bool ReferenceEquals(Student s1, Student s2)
         {
             if (s1.Equals(s2) ||
                  object.ReferenceEquals(s1, s2) ||
                  s1.Id==s2.Id 
                  s1==s2)
             {
                 return true;
             }
             else
             {
                 return false;
             }
         }
     }

    위의 코드에서 S1과 S2 참조가 동일하지 않지만, 우리는 그것을 볼 수 있지만 우리가 동일한 ID 학생들이 같은 학생이라고 생각하므로이 두 개체는 동일한 ID를 사용합니다. 이렇게하면 그 데이터베이스 것 중복되지 항목을 보장합니다.

    팁 : 변환 값 타입의 객체가 두 개의 매개 변수 만 참조로 전달되는 것입니다 권투에 필요하기 때문에 전용 값 유형 나타날 수 있습니다 동일한 종류의 참조의 경우는, 전화 ReferenceEquals 방법은 항상 false를 반환 값은 false를 반환합니다.

  2. 같음
    두 개체가이 두 물체가 동일한 데이터를 가지고 있는지 여부를 판단 할 수 있고, 등호 사용될 수 같은지 여부를 결정하는 단계를 포함한다. 이 방법의 대상에서 간단하게 신원을 확인하는 ReferenceEquals 메서드를 호출, 그래서 우리는 오버라이드 (override) 할 필요가 필요한 경우이 방법을 같음. 일반적으로 재정의 일반적인 방법 단계 같음 :
    • 객체가 널인지의 여부를 체크;
    • 참조 형이든 그 여부가 기준 같으면 결정 판단한다;
    • 같은 타입의 여부를 결정하는 단계;
    • 헬퍼 메소드의 특정 유형을 호출, 매개 변수를 비교하는 유형이어야합니다;
    • 확인 해시 코드가 같은지,이 공정과 작업 영역을 비교하여 단락의 필요성;
    • 전제의 기본 클래스 메서드를 재정의해야 검사가 기본 클래스를 같음된다 같음;
    • 분석 키 필드 값은 동일하다;
    • 를 GetHashCode 메소드를 재정의;
    • == 다시 쓰기,! = 연산자.

      팁 : 유형 시일의 유형 인 경우, 세 번째 단계는 생략 될 수있다.

    뿐만 아니라 우리는 또한 다음과 같은 점에주의 할 필요가 방법을, 같음 재정의 위의 단계를 수행해야 할 :
    • 우리는 두 개체가 동일한 지 여부를 결정하기 위해 반환 값에만 의존 할 수 있도록 반드시 값을 반환하지 않습니다를 GetHashCode 방법은 독특하다;
    • 우리는 어떤 예외 GetHashCode과 같음을 던질 수 없습니다;
    • 우리는 객체 사이의 비교가 없음을 확인해야하며, 예외를 트리거 할 수 없습니다;
    • 재정 같음, GetHashCode, ==와 =, 같은 알고리즘 반드시 재 작성!;를 구현해야합니다
    • 변수 유형에 항등 연산자를 다시 작성하지보십시오.

二, GetHashCode

이전 섹션에서 우리는 또한 재 작성 과정에서, 우리는 재정의 할 필요가 있습니다이를 GetHashCode 방법 같음. 소위 해시 코드 효율적 해시 테이블을 조절하는 등의 역할에 해당하는 디지털 값 및 상기 객체를 생성하는 데 사용된다. 무시를 GetHashCode 방법은 더 어렵습니다, 저는 여기에 상세하게 재 작성 규칙, 방법 및주의 사항에 대해 설명합니다. 무시를 GetHashCode 방법은 성능, 보안 고려 사항이 필요하지만, 또한 특정 요구 사항을 충족해야합니다.

  1. 성능
    개체의 경우 부분의 값이 INT의보기보다 값의 넓은 범위를 포함하므로 인해 반환 값의 해시 코드는, 다음의 해시 코드는 반드시 우리가 해시를 확인하려면 이렇게 할 때, 중복 된 경우 것, int 유형의 만을 반환 값으로 코드입니다. 또한 해시 코드 알고리즘 균일 int 형의 범위 내에서 가능으로 분배되어야 우리 해시 코드를 반환되도록. GetHashCode는 방법을 사용하여 단락 동작이 같을 때이 자주 통화를 GetHashCode있어서 발생하는 바와 같이 우리는 컬렉션의 사전을 사용하여 키 종류와 유형을 회피 알고리즘의 성능을 최적화한다. 를 GetHashCode 알고리즘 디자인에 관계없이 해시 테이블 해시 값 버킷 팅, 그것은 균형을 파괴하지 않습니다 방법이며, 균형을 확인해야합니다. 두 16 비트 해시 코드이어야 차에 의한 1 개 비트 차이 개체간에 일반적으로 이상적인 상태이다.
  2. 보안
    제 따라야 이러한 관점에서 안전성이 오브젝트의 해시 코드를 위조 일반적으로, 공격자가 해쉬 테이블의 해쉬 값의 다수의 동일한 데이터를 기록한다 곤란하고 효율을 달성하기 위해 해쉬 테이블이 높지 않으면 당신은 서비스 거부 공격을받을 수 있습니다. 우리는 일반적으로 서로 다른 유형 또는 관련 작업의 해시 코드를 사용하고 피연산자가 동일하거나 유사하지 않은 보장 할 수 있습니다. 상황이 유사하거나 피연산자가 발생 동일한 경우, 변위 및 추가 작업을 사용하는 것이 좋습니다. 그러나, 다수의 이용 및 조작 케이스 뜻 해시 값은 0이고, 1의 반복 사용이나 조작 상황 해시 값은주의를 필요로 발생한다. 또 다른 접근 방식은 우리가 INT 타입보다 큰 분해 개발 시프트 연산자를 사용한다는 것이다.
  3. 요구 사항
    요구 사항 좋은 작품에 대한 규정, 성능 및 보안 요구 사항을 준수하는 한, 성능 및 보안의 기초입니다. 그것은 첫 번째 점은 객체의 가장 기본적인 장점들이 동일한 해시 코드가 동일하고, 둘째 특정 수명주기에, 경우, 반환 값의를 GetHashCode 특정 객체가 항상 동일합니다, 그리고 마지막으로 GetHashCode는 예외를 던질 수있는 것입니다 필요 이는 비정상적인해야 또한 내부 고장이 발생 대표하는 값을 반환한다.

    셋째, 요약

    나는 독자가 읽기를 바란다 실제 개발에 많은 C #의 핵심 내용, 내용과 많은 지식을 포함하지만, 대부분의 개발자는 상관 없어 가상 메서드에 개체를 다시 작성 지식에 주로이 문서, 그래서 나의 기사 후 내용과 지식에 대한 기본적인 이해를 가지고 있습니다.

    블로그 기사 여러 플랫폼에서이 문서 OpenWrite 출시! 더 많은 기사를 들어 대중의 관심의 스캔 코드 번호를하시기 바랍니다 : "야옹 t-요"3Fn2bd.jpg

추천

출처www.cnblogs.com/gangzhucoll/p/12376110.html