programing

C#의 배열 목록 대 목록<>

megabox 2023. 5. 14. 10:31
반응형

C#의 배열 목록 대 목록<>

사이의 차이점은 무엇입니까?ArrayList그리고.List<>로? C#로?

그것뿐입니까?List<>이지만, 는 타입입니다.ArrayList안 그래요?

다 됐어요.List<T>는 제네릭 클래스입니다.특정 유형의 값을 사용자에게 또는 사용자로부터 주조하지 않고 저장할 수 있습니다.object복싱 해제 시) T는 의값유다에 있는 값 입니다.ArrayList대소문자).ArrayList단순저를 간단히 object참고 문헌일반적인 수집품으로서,List<T>인 일을구다니를 합니다.IEnumerable<T>를 사용하여할 수 .Cast또는OfType (으).

ArrayListC#에 제네릭이 없던 시절에 속합니다.을 위해 사용하지 않습니다.List<T> 사용하면 안 ArrayList목표로 하는 새로운 코드로.NET > = 2.0은 이를 사용하는 이전 API와 인터페이스할 필요가 없는 한.

용사를 합니다.List<T>주조 오류를 방지할 수 있습니다.런타임 캐스팅 오류를 방지하는 데 매우 유용합니다.

예:

여사(으)로 사용)ArrayList이 코드를 컴파일할 수 있지만 나중에 실행 오류가 표시됩니다.

ArrayList array1 = new ArrayList();
array1.Add(1);
array1.Add("Pony"); //No error at compile process
int total = 0;
foreach (int num in array1)
{
 total += num; //-->Runtime Error
}

사용하는 경우List다음 오류를 방지할 수 있습니다.

List<int> list1 = new List<int>();
list1.Add(1);
//list1.Add("Pony"); //<-- Error at compile process
int total = 0;
foreach (int num in list1 )
{
 total += num;
}

참조: MSDN

위의 사항에 추가합니다.용사를 합니다.ArrayList64비트 운영 체제에서는 32비트 운영 체제에서 사용하는 것보다 2배의 메모리를 사용합니다. 리스트 한편, 일반목List<T>메모리를 훨씬 더 적게 사용할 것입니다.ArrayList.

예를 들어, 우리가 사용하는 경우ArrayList32비트의 경우 19MB가 필요합니다. 64비트에서는 39MB가 필요합니다.하지만 당신이 일반적인 목록을 가지고 있다면,List<int>)의 .18MB(32비트)만 .64비트 단위의 MB로, 이는 ArrayList와 비교했을 때 481%나 큰 차이입니다.

원본: 기본 유형64비트에 대한 ArrayList's vs. 일반 목록

추가할 또 다른 차이점은 스레드 동기화와 관련된 것입니다.

ArrayList에서는 컬렉션 주위에 스레드 안전 래퍼를 반환하는 동기화된 속성을 통해 일부 스레드 안전을 제공합니다.래퍼는 모든 추가 또는 제거 작업에서 전체 컬렉션을 잠그는 방식으로 작동합니다.따라서 컬렉션에 액세스하려는 각 스레드는 한 개의 잠금을 사용할 차례를 기다려야 합니다.이는 확장 가능하지 않으며 대규모 수집의 경우 상당한 성능 저하를 초래할 수 있습니다.

List<T>에서는 스레드 동기화를 제공하지 않습니다. 사용자 코드는 여러 스레드에서 항목을 동시에 추가하거나 제거할 때 모든 동기화를 제공해야 합니다.

자세한 내용은 스레드 동기화를 참조하십시오.넷 프레임워크

간단한 대답은,

배열 목록이 일반이 아님

  • 개체 유형이므로 모든 데이터 유형을 저장할 수 있습니다.
  • 문자열, int, 직원 및 개체와 같은 모든 값(값 유형 또는 참조 유형)을 ArrayList에 저장할 수 있습니다. (참고 및 )
  • 복싱과 언복싱이 일어날 것입니다.
  • 안전하지 않습니다.
  • 그것은 더 오래되었습니다.

목록이 일반적임

  • Type(유형)이므로 런타임에 T를 지정할 수 있습니다.
  • 선언을 기준으로 Type T 값(문자열, 내부 또는 직원 또는 개체)만 저장할 수 있습니다.(참고 또는)
  • 복싱과 언복싱은 일어나지 않을 것입니다.
  • 안전을 입력합니다.
  • 그것은 더 최신입니다.

예:

ArrayList arrayList = new ArrayList();
List<int> list = new List<int>();

arrayList.Add(1);
arrayList.Add("String");
arrayList.Add(new object());


list.Add(1);
list.Add("String");                 // Compile-time Error
list.Add(new object());             // Compile-time Error

Microsoft 공식 문서 https://blogs.msdn.microsoft.com/kcwalina/2005/09/23/system-collections-vs-system-collection-generic-and-system-collections-objectmodel/ 을 읽어 보십시오.

여기에 이미지 설명 입력

참고: 차이점을 이해하기 전에 Generics를 알아야 합니다. https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/

성능은 이미 여러 답변에서 차별화 요소로 언급되었지만, "가 얼마나 느립니까?"와 "왜 전체적으로 느립니까?"를 다루기 위해 아래를 살펴봅니다.

이 급격히 떨어집니다.ArrayList단순히 요소를 추가하는 경우를 생각해 보십시오.복싱이 진행되고 있기 때문에 - 로.ArrayList의 추가 기능만 사용합니다.object- 는 매개변수 - 보다 훨씬 더 많은 .List<T>.

시차가 얼마나 납니까?의 경우보다 적어도 몇 배는 느림List<T>코드에 10 mint 값을 추가하면 어떤 일이 발생하는지 살펴 보십시오.ArrayListList<T>: 여기에 이미지 설명 입력

노란색으로 강조 표시된 '평균' 열의 실행 시간 차이가 5배입니다.또한 빨간색으로 강조 표시된 각 가비지 수집 횟수의 차이도 확인할 수 있습니다(GC 수/1000회 실행 수 없음).

프로파일러를 사용하여 상황을 신속하게 파악하는 것은 실제로 요소를 추가하는 것과는 반대로 대부분의 시간이 GC를 수행하는 데 사용된다는 것을 보여줍니다.아래의 갈색 막대는 가비지 수집기 활동을 차단하는 것을 나타냅니다.

위의 내용에 대한 자세한 분석을 작성했습니다.ArrayList시나리오는 여기 https://mihai-albert.com/2019/12/15/boxing-performance-in-c-analysis-and-benchmark/ 에 있습니다.

비슷한 발견은 제프리 리히터의 "CLR via C#"에도 있습니다.12장(일반)부터:

[…] 컴퓨터에서 이 프로그램의 릴리스 빌드(최적화가 설정된 상태)를 컴파일하고 실행하면 다음과 같은 출력이 표시됩니다.

= <00:00:01.6246959 (GCS= 6) 파일 <Int32>
00:00:10. Int328555008 (GCS=1800)
00:00:02.5427847(GCS=4) 파일<수정>
00:00:02.7944831 (GCS= 7) 파일입니다.

여기의 출력은 Int32 유형과 함께 일반 목록 알고리즘을 사용하는 것이 Int32와 함께 일반적이지 않은 ArrayList 알고리즘을 사용하는 것보다 훨씬 빠르다는 것을 보여줍니다.사실, 거의 11초와 1.6초의 차이가 있습니다. 그것은 ~7배 더 빠릅니다!또한 ArrayList와 함께 값 유형(Int32)을 사용하면 많은 복싱 작업이 발생하여 390개의 가비지 컬렉션이 생성됩니다.한편, List 알고리즘에는 6개의 가비지 컬렉션이 필요했습니다.

ArrayList의 모음인 반면, 다유데모음반인면은 데이터의 집합입니다.List<>유사한 유형의 자체 종속성 모음입니다.

ArrayList 반면에 반에안않습니다지전하면▁are▁safe.List<T>안전한 유형입니다.단순:).

에서 언급한 바와 같이.NET Framework 문서

다음을 사용하지 않는 것이 좋습니다.ArrayList새로운 발전을 위한 수업대신 일반을 사용하는 것이 좋습니다.List<T>반. 반. 반. 반.ArrayList클래스는 이기종 개체 컬렉션을 보유하도록 설계되었습니다.그러나 항상 최상의 성능을 제공하는 것은 아닙니다.대신 다음을 권장합니다.

  • 개체 이종개의경우를 합니다.List<Object> (C# 위단) 또List(Of Object)(Visual Basic에서) 유형을 입력합니다.
  • 개체 동한개의경우컬을 합니다.List<T>학생들

참고 항목일반이 아닌 컬렉션은 사용하면 됩니다.

표는 비표준 수집 유형이 일반적인 수집 유형으로 대체되는 방법을 보여줍니다.

내생에차은, 의점이각이사의 .ArrayList그리고.List<T>다음과 같습니다.

  1. List<T>보다 는여 T기 value-type보다 .ArrayList는 는이유 때문입니다.List<T>복싱/언복싱을 방지합니다(여기서 T는 값 유형).
  2. 많은 정보원들이 말합니다 - 보통ArrayList이전버의호위을사해다니용됩성 (합니다.)(실제 차이는 아니지만 중요한 참고 사항이라고 생각합니다.)
  3. 이지 않은 것이 .ArrayList그리고나서List<T>
  4. ArrayList가지다IsSynchronized소유물.따라서 동기화된 제품을 쉽게 만들고 사용할 수 있습니다.ArrayList찾지못다니를 .IsSynchronizedList<T>또한 이 유형의 동기화는 상대적으로 비효율적입니다. msdn):

    var arraylist = new ArrayList();
    var arrayListSyncronized = ArrayList.Synchronized(arraylist
    Console.WriteLine($"syncronized {arraylist.IsSynchronized}");
    Console.WriteLine($"syncronized {arrayListSyncronized.IsSynchronized}");
    
    var list = new List<object>();
    var listSyncronized = ArrayList.Synchronized(list);
    Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
    Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
    
  5. ArrayList가지다ArrayList.SyncRoot동기화(msdn)에 사용할 수 있는 속성. List<T>하지 않은SyncRoot속성, 그래서 다음 구조에서 당신이 사용한다면 당신은 어떤 객체를 사용해야 합니다.List<T>:

    ArrayList myCollection = new ArrayList();
    lock(myCollection.SyncRoot) //  ofcourse you can use another object for this goal
    {
        foreach (object item in myCollection)
        {
            // ...
        }
    }
    

목록을 사용하면 주조 오류를 방지할 수 있습니다.런타임 캐스팅 오류를 방지하는 데 매우 유용합니다.

예:

여기서 (ArrayList를 사용하여) 이 코드를 컴파일할 수 있지만 나중에 실행 오류가 표시됩니다.

    // Create a new ArrayList


    System.Collections.ArrayList mixedList = new System.Collections.ArrayList();


    // Add some numbers to the list
    mixedList.Add(7);
    mixedList.Add(21);


    // Add some strings to the list
    mixedList.Add("Hello");
    mixedList.Add("This is going to be a problem");




    System.Collections.ArrayList intList = new System.Collections.ArrayList();
    System.Collections.ArrayList strList = new System.Collections.ArrayList();


    foreach (object obj in mixedList)
    {
        if (obj.GetType().Equals(typeof(int)))
        {
            intList.Add(obj);
        }
        else if (obj.GetType().Equals(typeof(string)))
        {
            strList.Add(obj);
        }
        else
        {
            // error.
        }
    }

제게는 데이터를 아는 것이 전부입니다.효율성을 기반으로 코드를 계속 확장하는 경우, 항상 유형, 특히 '사용자 지정 유형'에 대해 궁금해하는 불필요한 단계 없이 데이터를 해독하는 방법으로 목록 옵션을 선택해야 합니다.기계가 차이를 이해하고 실제로 어떤 유형의 데이터를 처리하고 있는지 확인할 수 있다면, 왜 방해가 되고 시간을 낭비하면서 'IF THENELET' 결정을 해야 합니까?제 철학은 제가 기계를 만드는 대신 기계가 작동하도록 하는 것입니다.여러 개체 코드 명령의 고유한 차이를 알면 코드를 효율적으로 만들 수 있습니다.

Tom Johnson(원엔트리...하나의 출구)

언급URL : https://stackoverflow.com/questions/2309694/arraylist-vs-list-in-c-sharp

반응형