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];
}
(명확하게 구분하기 위해 코드 계약 관련 코드가 제거됨)
참고 항목:
Array.Empty
- 『 』
Array.Empty<T>()
- Marc Gravell - 할당, 할당, 할당 - 작은 숨겨진 할당에 대한 내가 가장 좋아하는 게시물.
사용해 보십시오.
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
'IT' 카테고리의 다른 글
SQL의 저장 프로시저에서 RETURN 값 가져오기 (0) | 2023.05.13 |
---|---|
matplotlib에서 그림 크기 및 그림 형식 변경 (0) | 2023.05.08 |
Node.js + MongoDB: 하나를 삽입하고 새로 삽입한 문서를 반환합니다. (0) | 2023.05.08 |
샘플 WPF 애니메이션은 어디서 찾을 수 있습니까? (0) | 2023.05.08 |
2.6 SDK를 사용하여 Azure Cloud Service Diagnostic 출력이 변경됨 (0) | 2023.05.08 |