IT

C#에서 빈 배열을 초기화하려면 어떻게 해야 합니까?

itgroup 2023. 5. 8. 22:07
반응형

C#에서 빈 배열을 초기화하려면 어떻게 해야 합니까?

크기를 지정하지 않고 빈 배열을 만들 수 있습니까?

예를 들어, 다음을 만들었습니다.

String[] a = new String[5];

우리는 크기 없이 위의 문자열 배열을 만들 수 있습니까?

크기를 미리 알 수 없는 컬렉션을 사용할 경우 어레이보다 더 나은 옵션이 있습니다.

을 합니다.List<string>대신 - 필요한 만큼 항목을 추가할 수 있으며 배열을 반환해야 할 경우 호출합니다.ToArray()변수에.

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

빈 배열을 생성해야 하는 경우 다음 작업을 수행할 수 있습니다.

string[] emptyStringArray = new string[0]; 

.NET 4.6에서 선호되는 방법은 다음과 같은 새로운 방법을 사용하는 것입니다.

String[] a = Array.Empty<string>();

일반 클래스의 정적 멤버가 에서 동작하는 방식을 사용하여 구현이 단순합니다.네트:

public static T[] Empty<T>()
{
    return EmptyArray<T>.Value;
}

// Useful in number of places that return an empty byte array to avoid
// unnecessary memory allocation.
internal static class EmptyArray<T>
{
    public static readonly T[] Value = new T[0];
}

(명확하게 구분하기 위해 코드 계약 관련 코드가 제거됨)

참고 항목:

사용해 보십시오.

string[] a = new string[] { };

크기를 0으로 초기화할 수 있지만 크기를 알면 어레이에 추가할 수 없기 때문에 다시 초기화해야 합니다.

string[] a = new string[0];

크기가 없는 배열을 선언하는 것은 큰 의미가 없습니다.배열의 크기는 대략적입니다.특정 크기의 어레이를 선언할 때 컬렉션에서 사용할 수 있는 고정 슬롯 수를 지정하면 메모리가 할당됩니다.여기에 무언가를 추가하려면 기존 어레이를 다시 초기화해야 합니다(어레이 크기를 조정하는 경우에도 이 스레드 참조).빈 배열을 초기화하려는 드문 경우 중 하나는 배열을 인수로 전달하는 것입니다.

어떤 때 것이 컬션의크알수없때정컬을의렉션어면려하다선것과 합니다.List<T>또는 그와 유사합니다.

즉, 크기를 지정하지 않고 배열을 선언하는 유일한 방법은 크기가 0인 빈 배열을 갖는 것입니다. hemant와 Alex Dn은 두 가지 방법을 제공합니다. 다른 간단한 대안은 다음과 같습니다.

string[] a = { };

[예를 들어 브래킷 내부의 요소는 암묵적으로 유형 정의로 변환할 수 있어야 합니다.]

또는 또 다른 것:

var a = Enumerable.Empty<string>().ToArray();

여기 좀 더 선언적인 방법이 있습니다.

public static class Array<T>
{
    public static T[] Empty()
    {
        return Empty(0);
    }

    public static T[] Empty(int size)
    {
        return new T[size];
    }
}

이제 전화할 수 있습니다.

var a = Array<string>.Empty();

//or

var a = Array<string>.Empty(5);

string[] a = new string[0];

또는 짧은 표기법:

string[] a = { };

현재 선호되는 방법은 다음과 같습니다.

var a = Array.Empty<string>();

Visual Studio에서 사용할 수 있는 짧은 정규식을 작성했습니다. 예를 들어 길이가 0인 할당을 대체하려면 다음과 같이 하십시오.new string[0]정규식 옵션이 켜진 상태에서 Visual Studio에서 찾기(검색) 사용:

new[ ][a-zA-Z0-9]+\[0\]

이제 모두 찾기 또는 F3(다음 찾기)를 모두 배열로 바꿉니다.비어 있습니다. <…>()!

심플하고 우아합니다!

string[] array = {}

런타임에 어레이 크기를 정의할 수 있습니다.

이렇게 하면 어레이의 크기를 동적으로 계산할 수 있습니다.그러나 일단 정의되면 크기는 불변입니다.

Array a = Array.CreateInstance(typeof(string), 5);

성능 규칙 CA1825: 길이가 0인 배열을 할당하지 마십시오.

규칙 설명:길이가 0인 배열을 초기화하면 불필요한 메모리 할당이 발생합니다.대신 어레이를 호출하여 정적으로 할당된 빈 어레이 인스턴스를 사용합니다.빈 메서드입니다.

당신의 경우:

var a = Array.Empty<string>(); 

시도해 본 적이 있습니다.

string[] sample = new string[0];

하지만 문자열 하나만 삽입할 수 있었고, 예외 Out Of Bound 오류가 발생했습니다. 그래서 그냥 크기를 넣었습니다.

string[] sample = new string[100];

아니면 저에게 맞는 또 다른 방법:

List<string> sample = new List<string>();

목록에 값 할당:

sample.Add(your input);

크기 없이 어레이를 만들 수는 없지만 사용할 수는 있습니다.

List<string> l = new List<string>() 

그리고 나서.l.ToArray().

@nawfal과 @Kobi 제안을 결합한 것:

namespace Extensions
{
    /// <summary> Useful in number of places that return an empty byte array to avoid unnecessary memory allocation. </summary>
    public static class Array<T>
    {
        public static readonly T[] Empty = new T[0];
    }
}

사용 예:

Array<string>.Empty

업데이트 2019-05-14

(@Jaiderity에 대한 공로)

더 나은 사용.Net API:

public static T[] Empty<T> ();

https://learn.microsoft.com/en-us/dotnet/api/system.array.empty?view=netframework-4.8

적용 대상:

.NET Core: 3.0 미리보기 5 2.2 2.1 1.0 1.0

.NET 프레임워크: 4.8 4.7.2 4.7.1 4.7 4.6.2 4.6 4.6

.NET 표준: 2.1 미리보기 2.0 1.6 1.5 1.4 1.3

...

HTH

배열을 사용할 수 있습니다. 메서드(.Net Core 이상)

string ToCsv(int[] myArr = null) { // null by default

    // affect an empty array if the myArr is null
    myArr ??= Array.Empty<int>();
    
    //... do stuff
    string csv = string.Join(",", myArr);

    return csv;
}

할 수 있는 일:

string[] a = { String.Empty };

참고: OP는 크기를 지정할 필요가 없고 배열 크기를 비좁게 만들 필요가 없음을 의미합니다.

여기 실제 사례가 있습니다.이 경우 어레이를 초기화해야 합니다.foundFiles첫 번째에서 0까지의 길이.

(다른 답변에서 강조한 바와 같이:이렇게 하면 배열의 길이가 1이므로 요소가 초기화되지 않으며 특히 인덱스가 0인 요소가 초기화되지 않습니다.배열의 길이는 이 줄 뒤에 0입니다!).

만약 그 부분이= string[0]생략되었습니다. 컴파일러 오류가 있습니다!

이것은 리트로우가 없는 캐치 블록 때문입니다.C# 컴파일러는 다음과 같은 코드 경로를 인식합니다.Directory.GetFiles()예외를 발생시켜 배열을 초기화 취소할 수 있습니다.

다른 사람이 말하기 전에 예외를 다시 적용하지 않는 것은 잘못된 오류 처리입니다.이것은 사실이 아닙니다.오류 처리는 요구 사항에 부합해야 합니다.

이 경우 프로그램은 읽기가 불가능한 디렉토리의 경우 계속 진행되어야 하며 중단되지 않아야 한다고 가정합니다. 가장 좋은 예는 디렉토리 구조를 통과하는 함수입니다.여기서 오류 처리는 로그에 기록하는 것입니다. 이 은 더 잘 수행될 수 를 들어 실패한 디렉토리가 모든 를 수집하는 것이 . 예를 들어 실패한 모든 디렉토리 수집GetFiles(Dir)목록에 있는 호출은 여기서 너무 멀리 갈 것입니다.

피한다는 것만으로도 충분합니다.throw는 유효한 시나리오이므로 배열을 길이 0으로 초기화해야 합니다.캐치 블록에서 이 작업을 수행하는 것으로 충분하지만, 이것은 나쁜 스타일일 것입니다.

:GetFiles(Dir)배열 크기를 조정합니다.

string[] foundFiles= new string[0];
string dir = @"c:\";
try
{
    foundFiles = Directory.GetFiles(dir);  // Remark; Array is resized from length zero
}
// Please add appropriate Exception handling yourself
catch (IOException)
{
  Console.WriteLine("Log: Warning! IOException while reading directory: " + dir);
  // throw; // This would throw Exception to caller and avoid compiler error
}

foreach (string filename in foundFiles)
    Console.WriteLine("Filename: " + filename);

언급URL : https://stackoverflow.com/questions/8727146/how-do-i-initialize-an-empty-array-in-c

반응형