2010-06-29 46 views
6

Có thể trong các phương thức giá trị mặc định của phương thức C# 4.0 như mảng (ví dụ: chuỗi [] sArray) không? nếu có, cách triển khai?C# 4.0: Phương thức tham số giá trị mặc định là mảng

tôi đã cố gắng gọi hàm như dưới đây:

MethodA(string[] legends=new string[]{"a","b"},float[] values=new float[]{1,2}, string alt="sd"); 

Nó không làm việc

Trả lời

10

Như những người khác đã nói, giá trị mặc định không thể là mảng. Tuy nhiên, một cách để tránh điều này là làm cho vô giá trị mặc định và sau đó khởi tạo mảng nếu cần thiết:

public void Foo(int[] x = null) 
{ 
    x = x ?? new int[] { 5, 10 }; 
} 

Hoặc nếu bạn sẽ không đột biến mảng hoặc tiếp xúc với người gọi:

private static readonly int[] FooDefault = new int[] { 5, 10 }; 
public void Foo(int[] x = null) 
{ 
    x = x ?? FooDefault; 
} 

Lưu ý rằng điều này giả định null không phải là giá trị mà bạn muốn sử dụng vì bất kỳ lý do nào khác. Nó không phải là một ý tưởng áp dụng toàn cầu, nhưng nó hoạt động tốt trong một số trường hợp mà bạn không thể diễn tả giá trị mặc định dưới dạng hằng số biên dịch. Bạn có thể sử dụng cùng một thứ cho những thứ như Encoding.UTF8 làm mã hóa mặc định.

Nếu bạn muốn tham số loại giá trị, bạn chỉ có thể đặt tham số đó thành giá trị rỗng. Ví dụ: giả sử bạn muốn đặt mặc định tham số cho số bộ xử lý (rõ ràng không phải là hằng số biên dịch), bạn có thể làm:

public void RunInParallel(int? cores = null) 
{ 
    int realCores = cores ?? Environment.ProcessorCount; 
} 
3

giá trị mặc định phải có thời gian biên dịch liên tục, có nghĩa là mảng không thể được sử dụng.

Tiêu chuẩn (pg 312) nói điều này:

Các biểu hiện trong một mặc định đối số phải là một trong những điều sau đây:

  • một hằng số thể hiện
  • một biểu hiện của tạo S mới() trong đó S là loại giá trị
  • biểu thức của mặc định biểu mẫu (S) trong đó S là một loại giá trị
+0

Oh wow thật khủng khiếp. Đó là cùng một vấn đề như các thuộc tính ngoại trừ tôi khá chắc chắn bạn thực sự có thể sử dụng mảng cho họ. Tại sao bạn không thể khai báo một mảng được khởi tạo? Chúng là hằng số –

+1

@Graphain: Theo cách nào là bất kỳ mảng nào khác ngoài một hằng số trống? Các mảng không trống luôn có thể thay đổi. Trình biên dịch sẽ phải tạo một bản sao của mảng trên mỗi cuộc gọi, trong trường hợp một cái gì đó (ví dụ như phương thức được gọi) đã thay đổi nội dung. –

+0

@Jon Skeet - Cũng có thể giả định rằng nếu các giá trị mặc định yêu cầu một trình biên dịch không đổi sẽ đủ thông minh để xử lý một mảng là chỉ đọc. Cách duy nhất đang thay đổi là nếu ai đó tinker với sự phản ánh đúng, đó sẽ là cùng một vấn đề cho các hằng số thực sự (ví dụ: chuỗi vv). –

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