Có thể tạo một mảng trống mà không chỉ định kích thước?
Ví dụ: tôi đã tạo:
String[] a = new String[5];
Chúng ta có thể tạo mảng chuỗi trên mà không có kích thước không?
Có thể tạo một mảng trống mà không chỉ định kích thước?
Ví dụ: tôi đã tạo:
String[] a = new String[5];
Chúng ta có thể tạo mảng chuỗi trên mà không có kích thước không?
Câu trả lời:
Nếu bạn định sử dụng một bộ sưu tập mà bạn không biết kích thước trước, có những lựa chọn tốt hơn so với mảng.
Sử dụng List<string>
thay thế - nó sẽ cho phép bạn thêm bao nhiêu mục bạn cần và nếu bạn cần trả về một mảng, hãy gọi ToArray()
biến.
var listOfStrings = new List<string>();
// do stuff...
string[] arrayOfStrings = listOfStrings.ToArray();
Nếu bạn phải tạo một mảng trống, bạn có thể làm điều này:
string[] emptyStringArray = new string[0];
string[]
không có yếu tố nào. Nếu bạn cố gắng truy cập emptyStringArray[0]
, bạn sẽ nhận đượcIndexOutOfRangeException
Thử cái này:
string[] a = new string[] { };
int[] variable = new int[]{}
và sử dụng nó chẳng hạn trong một vòng lặp, chẳng hạn như foreach (var s in variable){ Console.WriteLine(s);}
mã được biên dịch thành: int[] args1 = new int[0];
và foreach (int num in args1){Console.WriteLine(num);}
. Vì vậy, không nên có sự khác biệt giữa việc sử dụng new int[0]
và new int[]{}
vì cả hai đều được biên dịch thành cùng một mã.
var
, mặc dù chỉ dành cho các biến cục bộ (không phải cho các trường). Tuy nhiên, trong C # 2.0 (Visual Studio 2005) trở về trước, bạn phải sử dụng cú pháp của câu trả lời này (hoặc string[] a = new string[0];
).
Trong .NET 4.6, cách ưa thích là sử dụng một phương thức mới , Array.Empty
:
String[] a = Array.Empty<string>();
Việc triển khai ngắn gọn, sử dụng cách các thành viên tĩnh trong các lớp chung hoạt động trong .Net :
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];
}
(mã hợp đồng liên quan đến mã bị loại bỏ cho rõ ràng)
Xem thêm:
Array.Empty
mã nguồn trên Nguồn tham khảoArray.Empty<T>()
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
không không tạo ra một mảng. Nó trả về một tham chiếu đến một mảng được phân bổ trước.
Không có nhiều điểm trong việc khai báo một mảng không có kích thước. Một mảng có kích thước . Khi bạn khai báo một mảng có kích thước cụ thể, bạn chỉ định số lượng vị trí cố định có sẵn trong bộ sưu tập có thể chứa mọi thứ và bộ nhớ theo đó được phân bổ. Để thêm một cái gì đó vào nó, dù sao bạn cũng cần phải xác định lại mảng hiện có (ngay cả khi bạn đang thay đổi kích thước mảng, hãy xem chủ đề này ). Một trong những trường hợp hiếm hoi mà bạn muốn khởi tạo một mảng trống sẽ là truyền mảng làm đối số.
Nếu bạn muốn xác định một bộ sưu tập khi bạn không biết nó có thể có kích thước như thế nào, thì mảng không phải là lựa chọn của bạn, mà là một cái gì đó giống như List<T>
hoặc tương tự.
Điều đó nói rằng, cách duy nhất để khai báo một mảng mà không chỉ định kích thước là có một mảng trống có kích thước 0 . hemant và Alex Dn cung cấp hai cách. Một cách khác đơn giản hơn là chỉ :
string[] a = { };
[ Ví dụ, các phần tử bên trong khung phải được chuyển đổi hoàn toàn thành loại được xác định,string[] a = { "a", "b" };
]
Hoặc khác:
var a = Enumerable.Empty<string>().ToArray();
Đây là một cách khai báo hơn :
public static class Array<T>
{
public static T[] Empty()
{
return Empty(0);
}
public static T[] Empty(int size)
{
return new T[size];
}
}
Bây giờ bạn có thể gọi:
var a = Array<string>.Empty();
//or
var a = Array<string>.Empty(5);
Đơn giản và thanh lịch!
string[] array = {}
array
thành chỉ a
, như array
là một từ khóa khi viết hoa. Chỉ cần thực hành xấu để sử dụng tên từ khóa làm tên biến - ngay cả khi trường hợp khác. Và về cơ bản giống như câu trả lời của tôi ngoại trừ tôi có String.Empty
trong đó.
a
là xấu?
string[] a = new string[0];
hoặc ký hiệu ngắn:
string[] a = { };
Cách ưa thích bây giờ là:
var a = Array.Empty<string>();
Tôi đã viết một biểu thức chính quy ngắn mà bạn có thể sử dụng trong Visual Studio nếu bạn muốn thay thế phân bổ độ dài bằng không, ví dụ new string[0]
. Sử dụng Tìm kiếm (tìm kiếm) trong Visual Studio với tùy chọn Biểu thức chính quy được bật:
new[ ][a-zA-Z0-9]+\[0\]
Bây giờ Tìm tất cả hoặc F3 (Tìm tiếp theo) và thay thế tất cả bằng Array.Empty <trộm> ()!
Bạn có thể xác định kích thước mảng khi chạy .
Điều này sẽ cho phép bạn làm bất cứ điều gì để tính toán linh hoạt kích thước của mảng. Nhưng, một khi xác định kích thước là bất biến.
Array a = Array.CreateInstance(typeof(string), 5);
int i = 5; string[] a = new string[i];
Tôi đã thử:
string[] sample = new string[0];
Nhưng tôi chỉ có thể chèn một chuỗi vào nó và sau đó tôi đã gặp lỗi ngoại lệOutOfBound, vì vậy tôi chỉ cần đặt một kích thước cho nó, như
string[] sample = new string[100];
Hoặc một cách khác phù hợp với tôi:
List<string> sample = new List<string>();
Gán giá trị cho danh sách:
sample.Add(your input);
Kết hợp các đề xuất @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];
}
}
Ví dụ sử dụng:
Array<string>.Empty
CẬP NHẬT 2019-05-14
(tín dụng cho @Jaider ty)
Sử dụng tốt hơn .Net API:
public static T[] Empty<T> ();
https://docs.microsoft.com/en-us/dotnet/api/system.array.empty?view=netframework-4.8
Áp dụng cho:
.NET Core: 3.0 Xem trước 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
Tiêu chuẩn .NET: 2.1 Xem trước 2.0 1.6 1.5 1.4 1.3
...
HTH
arr = Array.Empty<string>();
Bạn có thể làm:
string[] a = { String.Empty };
Lưu ý: OP có nghĩa là không cần phải chỉ định kích thước, không làm cho một mảng không có kích thước
specify
kích thước, không tạo ra một mảng sizeless
.
Đây là một ví dụ thực tế. Trong trường hợp này, cần phải khởi tạo mảng foundFiles
trước thành độ dài bằng không.
(Như đã nhấn mạnh trong các câu trả lời khác: Điều này khởi tạo không phải là một phần tử và đặc biệt không phải là một phần tử có chỉ số bằng 0 vì điều đó có nghĩa là mảng có độ dài 1. Mảng có độ dài bằng 0 sau dòng này!).
Nếu phần = string[0]
bị bỏ qua, có lỗi trình biên dịch!
Điều này là do khối bắt mà không cần thiết. Trình biên dịch C # nhận ra đường dẫn mã, rằng hàm Directory.GetFiles()
có thể ném Ngoại lệ, để mảng có thể không được khởi tạo.
Trước khi bất cứ ai nói, không xem xét lại ngoại lệ sẽ là xử lý lỗi xấu: Điều này không đúng. Xử lý lỗi phải phù hợp với yêu cầu.
Trong trường hợp này, giả định rằng chương trình sẽ tiếp tục trong trường hợp thư mục không thể đọc được và không phá vỡ - ví dụ tốt nhất là hàm truyền qua cấu trúc thư mục. Ở đây xử lý lỗi chỉ là đăng nhập nó. Tất nhiên điều này có thể được thực hiện tốt hơn, ví dụ như thu thập tất cả các thư mục với GetFiles(Dir)
các cuộc gọi thất bại trong danh sách, nhưng điều này sẽ dẫn quá xa đến đây.
Nó là đủ để nói rằng tránh throw
là một kịch bản hợp lệ, và do đó, mảng phải được khởi tạo với độ dài bằng không. Nó là đủ để làm điều này trong khối bắt, nhưng đây sẽ là phong cách xấu.
Cuộc gọi để GetFiles(Dir)
thay đổi kích thước mảng.
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);