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];
이 시도:
string[] a= new string[] { };
.Net 4.6에서 선호되는 방법은 다음과 같은 새로운 방법을 사용하는 것입니다 Array.Empty
.
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-Allocaction, Allocation, Allocation- 작은 숨겨진 할당에 대해 내가 가장 좋아하는 게시물.
크기를 0으로 초기화 할 수는 있지만 크기를 알면 배열에 추가 할 수 없으므로 크기를 다시 초기화해야합니다.
string[] a = new string[0];
크기가없는 배열을 선언하는 데는 아무런 의미가 없습니다. 배열 은 대략 size 입니다. 특정 크기의 배열을 선언 할 때 컬렉션에서 사용할 수있는 고정 슬롯 수를 지정하면 메모리가 할당됩니다. 그것에 무언가를 추가하려면 어쨌든 기존 배열을 다시 초기화해야합니다 (배열의 크기를 조정 하더라도이 스레드를 참조하십시오 ). 빈 배열을 초기화하려는 드문 경우 중 하나는 배열을 인수로 전달하는 것입니다.
가능한 크기를 모를 때 컬렉션을 정의하려면 배열을 선택하는 것이 아니라 List<T>
비슷한 것을 선택하십시오 .
즉, size를 지정하지 않고 배열을 선언하는 유일한 방법은 크기가 0 인 빈 배열을 갖는 것 입니다. hemant 와 Alex Dn 은 두 가지 방법을 제공합니다. 또 다른 간단한 대안은 다음과 같습니다.
string[] a = { };
[ 괄호 안의 요소는 예를 들어 정의 된 유형으로 암시 적으로 변환 가능해야합니다.string[] a = { "a", "b" };
]
또는 또 다른 :
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[] array = {}
런타임시 배열 크기를 정의 할 수 있습니다 .
이를 통해 배열의 크기를 동적으로 계산할 수 있습니다. 그러나 일단 정의되면 크기는 불변입니다.
Array a = Array.CreateInstance(typeof(string), 5);
나는 시도했다 :
string[] sample = new string[0];
그러나 하나의 문자열 만 삽입 할 수 있었고 exceptionOutOfBound 오류가 발생하여 단순히 크기를 입력하십시오.
string[] sample = new string[100];
또는 나를 위해 일하는 다른 방법 :
List<string> sample = new List<string>();
목록에 값 할당 :
sample.Add(your input);
아시다시피 크기없이 배열을 만들 수는 없지만 사용할 수는 있습니다
List<string> l = new List<string>()
다음 l.ToArray()
.
넌 할 수있어:
string[] a = { String.Empty };
참고 : OP는 크기를 지정할 필요가 없으며 배열을 크기가 없도록 만듭니다.
여기 실제 사례가 있습니다. 이 경우 foundFiles
먼저 배열 을 0에서 0 으로 초기화해야합니다 .
(다른 답변에서 강조한 것처럼 : 이것은 요소가 아니라 특히 인덱스가 0 인 요소를 초기화하지 않습니다. 왜냐하면 배열의 길이가 1임을 의미하기 때문입니다. 배열은이 줄 뒤에 길이가 0입니다!).
부분 = string[0]
이 생략되면 컴파일러 오류가 있습니다!
이것은 다시 던지지 않은 캐치 블록 때문입니다. C # 컴파일러는 코드 경로를 인식하여 함수 Directory.GetFiles()
가 예외를 발생시켜 배열을 초기화 할 수 없도록합니다.
누군가가 말하기 전에 예외를 다시 발생시키지 않으면 오류 처리가 잘못됩니다. 이것은 사실이 아닙니다. 오류 처리는 요구 사항에 맞아야합니다.
이 경우, 읽을 수없는 디렉토리의 경우 프로그램이 계속되어야하고 가정하지 않는 것이 가장 좋은 예입니다. 가장 좋은 예는 디렉토리 구조를 순회하는 함수입니다. 여기서 오류 처리는 단지 로깅입니다. 물론 이것은 GetFiles(Dir)
목록에서 호출 이 실패한 모든 디렉토리를 수집하는 것과 같이 더 잘 수행 될 수 있지만, 여기서 너무 멀어 질 것입니다.
회피 throw
는 유효한 시나리오 라고 말하면 충분 하므로 배열의 길이는 0으로 초기화해야합니다. catch 블록에서 이것을 수행하는 것으로 충분하지만 이것은 나쁜 스타일입니다.
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);
@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
(@Jaider ty의 신용)
.Net API를 더 잘 사용하십시오.
public static T[] Empty<T> ();
https://docs.microsoft.com/en-us/dotnet/api/system.array.empty?view=netframework-4.8
적용 대상 :
.NET Core : 3.0 Preview 5 2.2 2.1 2.0 1.1 1.0
.NET Framework : 4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6
.NET 표준 : 2.1 Preview 2.0 1.6 1.5 1.4 1.3
...
HTH
참고 URL : https://stackoverflow.com/questions/8727146/how-do-i-initialize-an-empty-array-in-c
'Programing' 카테고리의 다른 글
파이썬에서 문자열에서 영숫자를 제외한 모든 것을 제거 (0) | 2020.03.18 |
---|---|
첫 번째 줄에서만 git log를 출력하는 방법은 무엇입니까? (0) | 2020.03.18 |
SVN의 결과 코드는 무엇을 의미합니까? (0) | 2020.03.18 |
JavaScript에서 문자열에 특정 문자가 포함되어 있는지 확인하는 방법은 무엇입니까? (0) | 2020.03.18 |
.NET / C #을 통해 CPU 코어 수를 찾는 방법은 무엇입니까? (0) | 2020.03.18 |