C\#일반적인 인 스 턴 스 상세 설명

8286 단어 C#범 형
본 고 는 사례 형식 으로 C\#범 형의 용법 을 서술 하여 독자 들 이 C\#범 형의 원 리 를 깊이 이해 하 는 데 도움 이 되 고 구체 적 으로 다음 과 같이 분석 했다.
우선 팬 형 을 언제 사용 하 는 지 알 아야 한다.
서로 다른 데이터 형식 에 대해 비슷 한 논리 알고리즘 을 사용 하면 중복 을 피하 기 위해 범 형 을 사용 하 는 것 을 고려 할 수 있다.
1.유형 에 대한 일반적인 유형
서로 다른 유형의 배열 에 대해 배열 에 대한'거품 정렬'을 쓰 십시오.
1.사고방식
●유형 에 대한 범 형,범 형 은 유형 옆 에 있다.
●'거품 정렬'에서 요 소 를 비교 해 야 하기 때문에 범 형 은 IComparable 인터페이스 로 제약 해 야 한다.

  class Program
  {
    static void Main(string[] args)
    {
      SortHelper<int> isorter = new SortHelper<int>();
      int[] iarray = {8, 7, 1, 2, 12};
      isorter.BubbleSort(iarray);
      foreach (int item in iarray)
      {
        Console.Write(item+ ", ");
      }
      Console.ReadKey();
    }
  }
 
  public class SortHelper<T> where T : IComparable
  {
    public void BubbleSort(T[] array) 
    {
      int length = array.Length;
      for (int i = 0; i <= length -2; i++)
      {
        for (int j = length - 1; j >= 1; j--)
        {
          if (array[j].CompareTo(array[j-1]) < 0)
          {
            T temp = array[j];
            array[j] = array[j - 1];
            array[j - 1] = temp;
          }
        }
      }
    }
  }
 
실행 결 과 는 다음 그림 과 같 습 니 다.

2.일반적인 제약 조건
where T:IComparable 은 T 를 IComparable 인터페이스 로 제약 합 니 다.
where T : class
where T : struct
where T:IComparable,new()제약 범 형 은 구조 함수 가 있어 야 합 니 다.
3.거품 알고리즘
●for(int i=0;i <= length -2; i++)이것 은 경계 사고 입 니 다.예 를 들 어 길이 가 5 인 배열 이 있 습 니 다.만약 에 0 번 요소 가 최종 적 으로 4 번 위치 로 바 뀌 면 매번 에 한 자 리 를 바 꾸 려 면 4 번 을 거 쳐 야 4 번 자리 에 도착 할 수 있 습 니 다.즉,for(int i=0;i<=5-2,i++),i 는 0,1,2,4 순 으로 그 동안 4 번 을 겪 었 다.
●for(int j=length-1;j >= 1; j-)순환,즉 마지막 요소 부터 색인 이 1 인 요 소 를 옮 겨 다 니 며 매번 이전 위치 에 있 는 요소 와 비교 합 니 다.
4.비교
int 유형 을 비교 할 수 있 는 이 유 는 int 유형 도 IComparable 인 터 페 이 스 를 실 현 했 기 때문이다.

byte 유형 도 IComparable 인 터 페 이 스 를 실현 했다.

2.하나의 종 류 를 사용자 정의 하여 거품 알고리즘 도 실현 할 수 있 도록 합 니 다.
거품 알고리즘 은 요소 비교 와 관련 되 기 때문에 사용자 정의 클래스 는 IComparable 인 터 페 이 스 를 실현 해 야 합 니 다.

  class Program
  {
    static void Main(string[] args)
    {
      Book[] bookArray = new Book[2];
      Book book1 = new Book(100, "  ");
      Book book2 = new Book(80, "  ");
      bookArray[0] = book1;
      bookArray[1] = book2;
 
      Console.WriteLine("    :");
      foreach (Book b in bookArray)
      {
        Console.WriteLine("  :{0},  :{1}", b.Title, b.Price);
      }
 
      SortHelper<Book> sorter = new SortHelper<Book>();
      sorter.BubbleSort(bookArray);
      Console.WriteLine("    :");
      foreach (Book b in bookArray)
      {
        Console.WriteLine("  :{0},  :{1}", b.Title, b.Price);
      }
      Console.ReadKey();
    }
  }
 
  public class SortHelper<T> where T : IComparable
  {
    public void BubbleSort(T[] array) 
    {
      int length = array.Length;
      for (int i = 0; i <= length -2; i++)
      {
        for (int j = length - 1; j >= 1; j--)
        {
          if (array[j].CompareTo(array[j-1]) < 0)
          {
            T temp = array[j];
            array[j] = array[j - 1];
            array[j - 1] = temp;
          }
        }
      }
    }
  }
 
  //      IComparable  
  public class Book : IComparable
  {
    private int price;
    private string title;
 
    public Book(){}
 
    public Book(int price, string title)
    {
      this.price = price;
      this.title = title;
    }
 
    public int Price
    {
      get { return this.price; }
    }
 
    public string Title
    {
      get { return this.title; }
    }
 
    public int CompareTo(object obj)
    {
      Book book = (Book)obj;
      return this.Price.CompareTo(book.Price);
    }
  }

실행 결 과 는 다음 그림 과 같 습 니 다.

3.방법 에 대한 일반적인 유형
위의 예 를 계속 들 어 클래스 를 정의 하고 일반적인 방법 을 정의 합 니 다.

  //    
  public class MethodSortHelper
  {
    public void BubbleSort<T>(T[] array) where T : IComparable
    {
      int length = array.Length;
      for (int i = 0; i <= length - 2; i++)
      {
        for (int j = length - 1; j >= 1; j--)
        {
          if (array[j].CompareTo(array[j - 1]) < 0)
          {
            T temp = array[j];
            array[j] = array[j - 1];
            array[j - 1] = temp;
          }
        }
      }
    }
  }
 
주 프로그램 은 다음 과 같 습 니 다:

  class Program
  {
    static void Main(string[] args)
    {
      Book[] bookArray = new Book[2];
      Book book1 = new Book(100, "  ");
      Book book2 = new Book(80, "  ");
      bookArray[0] = book1;
      bookArray[1] = book2;
 
      Console.WriteLine("    :");
      foreach (Book b in bookArray)
      {
        Console.WriteLine("  :{0},  :{1}", b.Title, b.Price);
      }
 
      MethodSortHelper sorter = new MethodSortHelper();
      sorter.BubbleSort<Book>(bookArray);
      Console.WriteLine("    :");
      foreach (Book b in bookArray)
      {
        Console.WriteLine("  :{0},  :{1}", b.Title, b.Price);
      }
      Console.ReadKey();
    }
  }  
 
실행 결 과 는 다음 그림 과 같 습 니 다.

또한 일반적인 방법 을 사용 할 때 다음 과 같은 것 을 제외 하고:

MethodSortHelper sorter = new MethodSortHelper(); 
sorter.BubbleSort<Book>(bookArray);
이렇게 쓸 수도 있다.  

      MethodSortHelper sorter = new MethodSortHelper(); 
      sorter.BubbleSort(bookArray); 
     
이 를 통 해 알 수 있 듯 이 범 형 방법 은 배열 의 인 스 턴 스 암시 적 인 방식 에 따라 범 형 이 조건 을 만족 시 키 는 지 여 부 를 추정 할 수 있다.
4.범 형의 다른 장점
1.은밀 한 포장 과 분해 방지
다음은 암시 적 인 포장 과 개봉 을 포함 합 니 다.

ArrayList list = new ArrayList();
for(int i = 0; i < 3; i++)
{
  list.Add(i); //Add            object,         
}
for(int i = 0; i < 3; i++)
{
  int value = (int)list[i]; //          ,  
  Console.WriteLine(value);
}

범 형 을 사용 하여 암시 적 인 포장 과 상 자 를 뜯 는 것 을 피한다.

List<int> list = new List<int>();
for(int i = 0; i < 3; i++)
{
  list.Add(i);
}
for(int i = 0; i < 3; i++)
{
  int value = list[i];
  Console.WriteLine(value);
}

2.컴 파일 기간 에 오 류 를 발견 할 수 있 습 니 다.
일반적인 형식 을 사용 하지 않 고 컴 파일 기간 에 잘못 보고 하지 않 는 예:

ArrayList list = new ArrayList();
int i = 100;
list.Add(i);
string value = (string)list[0];

일반적인 형식 을 사용 하여 컴 파일 기간 에 오 류 를 발견 합 니 다.

List<int> list = new List<int>();
int i = 100;
list.Add(i);
string value = (string)list[0];

5.일반적인 기 교 를 사용한다.
1.현재 파일 에서 일반 형식 에 별명 붙 이기

using IntList = List<int>;
IntList list = new IntList();
list.Add(1);

2.서로 다른 파일 에서 범 형 별명 을 사용 하여 범 형 에서 태 어 난 클래스 를 정의 합 니 다.

public class IntList : List<int>{}

좋은 웹페이지 즐겨찾기