Tôi có thể cung cấp giá trị mặc định cho tham số hoặc tham số tùy chọn trong các hàm C # không?


77

Tôi có thể cung cấp các tham số mặc định trong C # không?

Trong C:

void fun(int i = 1)
{
    printf("%d", i);
}

Chúng ta có thể cung cấp cho các tham số một giá trị mặc định không? Có thể trong C # không? Nếu vậy, chúng ta có thể tránh quá tải các hàm không?

Việc thêm một tham số tùy chọn vào một hàm hiện có luôn là một thói quen không tốt. Nếu bạn đang làm việc trên một dự án đang phải tham chiếu đến lớp có một hàm và chúng tôi đã thay đổi một tham số với một giá trị tùy chọn, nó có thể đưa ra một ngoại lệ về thời gian chạy mà phương thức không được tìm thấy.

Điều này là do chúng tôi sẽ xem xét rằng nếu chúng tôi thêm một giá trị tùy chọn bổ sung, thì không cần thay đổi mã nếu hàm được sử dụng ở nhiều nơi.

function Add(int a, int b);

Điều này sẽ được gọi bằng cách này:

Add(10, 10);

Nhưng nếu chúng ta thêm một tham số tùy chọn như thế này,

function Add(int a, int b, int c = 0);

thì trình biên dịch mong đợi

Add(10, 10, 0);

Trên thực tế, chúng tôi đang gọi như thế này Add(10, 10) và chức năng này sẽ không khả dụng trong lớp đó và gây ra ngoại lệ thời gian chạy.

Điều này xảy ra trong khi thêm một tham số mới vào một hàm được nhiều nơi gọi và tôi không chắc điều này sẽ xảy ra mọi lúc. Nhưng tôi đề nghị bạn quá tải chức năng.

Luôn luôn chúng ta cần quá tải phương thức có một tham số tùy chọn. Ngoài ra, nếu bạn đang làm việc với các hàm có nhiều hơn một tham số tùy chọn, thì tốt hơn là chuyển giá trị bằng cách sử dụng tên của tham số.

function Add(int a, int b, int c = 0);

Luôn luôn tốt để gọi hàm này bằng cách sau.

Add(10, 20, c:30);

1
@Vyas now C # 4.0 có thể
— kbvishnu


@nawfal nó đã hỏi rất lâu và trong khi làm việc với thông số tùy chọn, tôi gặp một số vấn đề. Vì vậy, tôi đã cập nhật câu hỏi.
— kbvishnu

1
@VeeKayBee đúng vậy, nhưng bạn có câu hỏi nào đó (trong bản chỉnh sửa) không? Nếu bạn muốn đưa ra quan điểm đó, tại sao không trả lời nó trong một chủ đề có liên quan (thậm chí có thể là điều này)?
— nawfal

@nawfal cảm ơn bạn đã gợi ý. tôi sẽ cập nhật dưới dạng câu trả lời
— kbvishnu

Câu trả lời:


79

Đó chính xác là cách bạn thực hiện trong C #, nhưng tính năng này lần đầu tiên được thêm vào .NET 4.0


5
Có thể sử dụng nó trong .NET 3.5
— Marek Kwiendacz

Visual Studio 2010+có msbuildvới multitargetingtính năng ( msdn.microsoft.com/en-us/library/vstudio/… ). Nó có thể sử dụng các gói Target .NET 4.0để xây dựng các tham số tùy chọn của bạn thành một loạt các phương thức quá tải.
— dbardakov

còn các phương thức nội tuyến (Func, Action, Delegate) thì sao?
— EricG

44

Đúng. Xem Đối số được đặt tên và tùy chọn . Lưu ý rằng giá trị mặc định cần phải là một hằng số, vì vậy điều này là OK:

public string Foo(string myParam = "default value") // constant, OK
{
}

nhưng đây không phải là:

public void Bar(string myParam = Foo()) // not a constant, not OK
{
}

27

Nó chỉ có thể từ C # 4.0

Tuy nhiên, khi bạn sử dụng phiên bản C #, trước 4.0, bạn có thể giải quyết vấn đề này bằng cách sử dụng các phương pháp nạp chồng:

public void Func( int i, int j )
{
    Console.WriteLine (String.Format ("i = {0}, j = {1}", i, j));
}

public void Func( int i )
{
    Func (i, 4);
}

public void Func ()
{
    Func (5);
}

(Hoặc, bạn có thể nâng cấp lên C # 4.0).



1

Chức năng này có sẵn từ C # 4.0 - nó đã được giới thiệu trong Visual Studio 2010. Và bạn có thể sử dụng nó trong dự án cho .NET 3.5. Vì vậy, không cần phải nâng cấp các dự án cũ trong .NET 3.5 lên .NET 4.0.

Bạn chỉ cần sử dụng Visual Studio 2010, nhưng hãy nhớ rằng nó phải biên dịch sang phiên bản ngôn ngữ mặc định (đặt nó trong Project Properties-> Buid-> Advanced ...)

Trang MSDN này có thêm thông tin về các tham số tùy chọn trong VS 2010.


0

Đây là một tính năng của C # 4.0, nhưng không thể thực hiện được nếu không sử dụng chức năng quá tải trước phiên bản đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.