2010-07-09 51 views
43

Nếu mảng trống, có vẻ như bạn không thể kiểm tra độ dài của nó bằng ".length". Cách tốt nhất để kiểm tra xem một mảng có trống không?Nếu (Array.Length == 0)

Trả lời

117

Bạn hoàn toàn có thể kiểm tra chiều dài của ô là rỗng. Tuy nhiên, nếu bạn cố gắng làm điều đó trên một tham chiếu null, bạn sẽ nhận được một ngoại lệ. Tôi nghi ngờ đó là những gì bạn đang chạy vào. Bạn có thể đối phó với cả hai mặc dù:

if (array == null || array.Length == 0) 

Nếu đó không phải là nguyên nhân, vui lòng cung cấp một chương trình ngắn nhưng đầy đủ để chứng minh sự cố. Nếu rằng nguyên nhân, bạn nên dành chút thời gian để đảm bảo rằng bạn hiểu các tham chiếu không có giá trị so với các bộ sưu tập/chuỗi "trống" bất kỳ thứ gì.

+0

Trong trường hợp nào một mảng có .Length == 0? Một mảng được định kích thước 0? – sooprise

+8

... một mảng trống. –

+0

@Soo: Vâng, chính xác. –

13

Yeah, vì sự an toàn có lẽ tôi sẽ làm gì:

if(array == null || array.Length == 0) 
4

Bạn có thể sử dụng .Length == 0 nếu chiều dài là trống và mảng tồn tại, nhưng bạn có chắc nó không phải null?

2

Đây là cách tốt nhất. Xin lưu ý Array là một đối tượng trong NET vì vậy bạn cần phải kiểm tra null trước.

0

làm bạn có nghĩa là trống hoặc null, hai thứ khác nhau,

nếu mảng được khởi tạo nhưng trống rỗng, sau đó chiều dài là đúng, nếu nó chưa được khởi tạo sau đó kiểm tra vs rỗng

1

kiểm tra đề nghị của bạn là tốt, miễn là mảng được intialised ...

Martin.

2

Như những người khác đã đề xuất có khả năng bạn đang nhận được NullReferenceException có thể tránh được bằng cách kiểm tra xem liệu tham chiếu có phải là null hay không. Tuy nhiên, bạn cần phải tự hỏi liệu kiểm tra đó có thực sự được bảo hành hay không. Bạn sẽ làm điều đó vì tham chiếu thực sự có thể là null và nó là null có ý nghĩa đặc biệt trong mã của bạn? Hay bạn sẽ làm nó để che đậy một lỗi? Bản chất của câu hỏi khiến tôi tin rằng nó sẽ là thứ sau. Trong trường hợp đó bạn thực sự cần phải kiểm tra mã sâu và tìm ra lý do tại sao tham chiếu đó không được khởi tạo đúng cách ngay từ đầu.

2

Jon Skeet đã trả lời chính xác. Chỉ cần nhớ rằng thứ tự của thử nghiệm trong "IF" là quan trọng. Kiểm tra null trước chiều dài. Tôi cũng thích đặt null ở phía bên trái của bình đẳng ... chỉ là một thói quen tôi nhận được từ Java đã làm cho mã hiệu quả hơn và nhanh chóng ... Tôi không nghĩ rằng nó quan trọng trong rất nhiều ứng dụng ngày hôm nay, nhưng đó là thực hành tốt.

nếu (null == mảng || array.Length == 0)

1

if (array.length> 0)

+2

bạn ít nhất có thể nói lý do tại sao bạn gõ này xuống ... những gì sai với điều này? – Wills

+0

Điều này sẽ dẫn đến một ngoại lệ tham chiếu null nếu "mảng" là null. – computerGuyCJ

+0

cho một điều, trường hợp của bạn bị tắt; đây không phải là C# hợp lệ như được viết –

3

Bạn có thể sử dụng

if (array == null || array.Length == 0) 

HOẶC

if (!(array != null && array.Length >= 0)) 

LƯU Ý !!!!! Để đảm bảo rằng C# sẽ thực hiện ngắn mạch chính xác; bạn phải so sánh đối tượng đó với NULL trước khi bạn đi đến đối tượng con so sánh của đối tượng.

1

kiểm tra nếu mảng là null đầu tiên, do đó bạn sẽ tránh một con trỏ ngoại lệ vô

logic trong bất kỳ ngôn ngữ: nếu mảng là null hoặc rỗng: làm ....

0

Nếu arraynull, cố gắng derefrence array.Length sẽ ném một NullReferenceException. Nếu mã của bạn xem xét null là một giá trị không hợp lệ cho array, bạn nên từ chối và đổ lỗi cho người gọi. Một trong những mô hình là để ném ArgumentNullException:

void MyMethod(string[] array) 
{ 
    if (array == null) throw new ArgumentNullException(nameof(array)); 

    if (array.Length > 0) 
    { 
     // Do something with array… 
    } 
} 

Nếu bạn muốn chấp nhận một mảng null như một dấu hiệu để không làm điều gì đó hoặc như là một tham số tùy chọn, bạn có thể đơn giản là không truy cập vào nó nếu nó là null:

void MyMethod(string[] array) 
{ 
    if (array != null) 
    { 
     // Do something with array here… 
    } 
} 

Nếu bạn muốn tránh chạm vào array khi nó là null hoặc có độ dài bằng không, khi đó bạn có thể kiểm tra cả hai cùng lúc với C#-6’s null coalescing operator.

void MyMethod(string[] array) 
{ 
    if (array?.Length > 0) 
    { 
     // Do something with array… 
    } 
} 

Thừa Thời lượng Kiểm tra

Nó có vẻ lạ mà bạn đang điều trị các mảng trống rỗng như một trường hợp đặc biệt. Trong nhiều trường hợp, nếu bạn, ví dụ: sẽ chỉ lặp lại mảng đó, không cần xử lý mảng trống dưới dạng trường hợp đặc biệt. foreach (var elem in array) {«body»} sẽ không bao giờ thực thi «body» khi array.Length0. Nếu bạn đang xử lý array == null || array.Length == 0 đặc biệt, ví dụ: cải thiện hiệu suất, bạn có thể cân nhắc để lại nhận xét về hậu thế. Nếu không, séc cho Length == 0 sẽ xuất hiện không cần thiết.

Mã thừa khiến cho việc hiểu chương trình khó hơn vì mọi người đọc mã có khả năng giả định rằng mỗi dòng là cần thiết để giải quyết một số vấn đề hoặc đạt được tính chính xác. Nếu bạn bao gồm mã không cần thiết, người đọc sẽ chi tiêu mãi mãi cố gắng tìm ra lý do tại sao dòng đó là hoặc là cần thiết trước khi xóa nó ;-).

Các vấn đề liên quan