2011-07-05 31 views
36
public void Foo(params string[] values) 
{ 
} 

Có thể values có thể là null hoặc luôn luôn được đặt bằng 0 hoặc các mục khác không?C# - Có thể có tham số null không?

+2

Vâng, tôi không biết làm thế nào bạn có thể vượt qua trong null để chức năng đó và có nó gán cho các giá trị. Tôi đoán tôi đang hỏi "có thể làm điều đó không?" – michael

+3

'Foo (null)' có thể đáng để thử. –

+11

"Hãy dùng thử" hầu như không bao giờ đưa ra câu trả lời dứt khoát. Phương thức 'params' có thể được gọi theo nhiều cách, làm cho câu hỏi này trở thành một câu hỏi hợp lệ. –

Trả lời

57

Tuyệt đối - bạn có thể gọi nó với một đối số kiểu string [] với giá trị null:

string[] array = null; 
Foo(array); 
+1

@Chuyển hướng, bạn không chính xác. Việc truyền null vào vị trí của một mảng params sẽ tạo ra một mảng tham chiếu null. Một mảng chiều dài bằng không sẽ được tạo chỉ khi bạn chuyển một cách rõ ràng vào * hoặc * bỏ qua đối số trong cuộc gọi phương thức hoàn toàn. Một mảng của một phần tử null sẽ phải được tạo một cách rõ ràng. –

+0

@Schroedingers, Jon và Anthony là đúng. Xem [demo] (http://ideone.com/xhpdI). Nếu bạn chuyển một tham chiếu mảng (bao gồm cả 'null' chữ thường),' giá trị' sẽ chính xác. Mặt khác, nếu bạn chuyển một tham chiếu * string * có giá trị rỗng, nó sẽ là một mảng có độ dài 1 như bạn đã nói. –

+0

@Jon: Tôi đã theo ấn tượng mạnh mẽ rằng OP hỏi về những gì đã xảy ra trong trường hợp của 'Foo()'. Bạn có thể kiểm tra lý do của tôi trong câu trả lời đã bị xóa của tôi trong trường hợp bạn quan tâm :) – sehe

3

Ngoài câu trả lời của Jon, bạn cũng có thể có một cái gì đó như thế này:

string[] array1 = new string[]; //array is not null, but empty 
Foo(array1); 
string[] array2 = new string[] {null, null}; //array has two items: 2 null strings 
Foo(array2); 
24

Tôi quyết định viết một số mã để tự mình kiểm tra. Sử dụng chương trình sau đây:

using System; 

namespace TestParams 
{ 
    class Program 
    { 
     static void TestParamsStrings(params string[] strings) 
     { 
      if(strings == null) 
      { 
       Console.WriteLine("strings is null."); 
      } 
      else 
      { 
       Console.WriteLine("strings is not null."); 
      } 
     } 

     static void TestParamsInts(params int[] ints) 
     { 
      if (ints == null) 
      { 
       Console.WriteLine("ints is null."); 
      } 
      else 
      { 
       Console.WriteLine("ints is not null."); 
      } 
     } 

     static void Main(string[] args) 
     { 
      string[] stringArray = null; 

      TestParamsStrings(stringArray); 
      TestParamsStrings(); 
      TestParamsStrings(null); 
      TestParamsStrings(null, null); 

      Console.WriteLine("-------"); 

      int[] intArray = null; 

      TestParamsInts(intArray); 
      TestParamsInts(); 
      TestParamsInts(null); 
      //TestParamsInts(null, null); -- Does not compile. 
     } 
    } 
} 

Kết quả sau đây được mang lại:

strings is null. 
strings is not null. 
strings is null. 
strings is not null. 
------- 
ints is null. 
ints is not null. 
ints is null. 

Vì vậy, vâng, nó là hoàn toàn có thể cho mảng kết hợp với params là null.

4

Dự đoán đầu tiên của tôi là khai báo tham số với giá trị mặc định bằng 0, điều này có ý nghĩa trong một số trường hợp, nhưng ngôn ngữ C# không cho phép điều này.

static void Test(params object[] values = null) // does not compile 
{ 
} 

lỗi CS1751: Không thể chỉ định một giá trị mặc định cho một mảng tham số

Cách nhận khắc phục hạn chế này bằng cách thông qua một cách rõ ràng rỗng đã được trả lời.

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