2008-11-07 38 views
29

Có cách nào để truyền đối số null cho các phương thức C# (một cái gì đó giống như các đối số null trong C++) không?Truyền đối số null cho các phương thức C#

Ví dụ:

Có thể dịch C++ chức năng sau đây để C phương pháp #:

private void Example(int* arg1, int* arg2) 
{ 
    if(arg1 == null) 
    { 
     //do something 
    } 
    if(arg2 == null) 
    { 
     //do something else 
    } 
} 

Trả lời

68

Có. Có hai loại kiểu trong .NET: kiểu tham chiếu và kiểu giá trị.

Các loại tham chiếu (thường là các lớp) luôn được tham chiếu bởi tham chiếu, vì vậy chúng hỗ trợ null mà không cần thêm bất kỳ công việc nào. Điều này có nghĩa rằng nếu một loại biến là một kiểu tham chiếu, biến đó sẽ tự động là một tham chiếu.

Loại giá trị (ví dụ: int) theo mặc định không có khái niệm rỗng. Tuy nhiên, có một wrapper cho họ gọi là Nullable. Điều này cho phép bạn đóng gói kiểu giá trị không nullable và bao gồm thông tin null.

Tuy nhiên, việc sử dụng hơi khác.

// Both of these types mean the same thing, the ? is just C# shorthand. 
private void Example(int? arg1, Nullable<int> arg2) 
{ 
    if (arg1.HasValue) 
     DoSomething(); 

    arg1 = null; // Valid. 
    arg1 = 123; // Also valid. 

    DoSomethingWithInt(arg1); // NOT valid! 
    DoSomethingWithInt(arg1.Value); // Valid. 
} 
+0

Bạn có thể vui lòng cho tôi biết sự khác biệt b/w 'private void Example (int arg1?) 'Và' private void Example (int? Arg1 = 0) ' – Unbreakable

3

Từ C# 2.0:

private void Example(int? arg1, int? arg2) 
{ 
    if(arg1 == null) 
    { 
     //do something 
    } 
    if(arg2 == null) 
    { 
     //do something else 
    } 
} 
4

Bạn có thể sử dụng NullableValueTypes (như int?) cho việc này. Mã sẽ giống như thế này:

private void Example(int? arg1, int? arg2) 
{ 
    if(!arg1.HasValue) 
    { 
     //do something 
    } 
    if(!arg2.HasValue) 
    { 
     //do something else 
    } 
} 
3

Bắt đầu từ C# 2.0, bạn có thể sử dụng loại generic có thể null Nullable và trong C# có ký hiệu viết tắt loại tiếp theo?

ví dụ:

private void Example(int? arg1, int? arg2) 
{ 
    if(arg1 == null) 
    { 
     //do something 
    } 
    if(arg2 == null) 
    { 
     //do something else 
    } 
} 
5

Tôi nghĩ C# gần nhất tương đương với int* sẽ là ref int?. Bởi vì ref int? cho phép phương thức được gọi để chuyển một giá trị trở lại phương thức gọi.

int*

  • thể được null.
  • Có thể không rỗng và trỏ đến giá trị số nguyên.
  • Nếu không rỗng, giá trị có thể được thay đổi và thay đổi sẽ lan truyền cho người gọi.
  • Đặt thành giá trị rỗng không được trả lại cho người gọi.

ref int?

  • thể được null.
  • Có thể có giá trị số nguyên.
  • Giá trị luôn có thể được thay đổi và thay đổi sẽ lan truyền cho người gọi.
  • Giá trị có thể được đặt thành rỗng và thay đổi này cũng sẽ lan truyền cho người gọi.
2
câu hỏi

Các OP được trả lời cũng đã có, nhưng tiêu đề là chỉ rộng đủ mà tôi nghĩ rằng nó có lợi từ mồi sau:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace consolePlay 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program.test(new DateTime()); 
      Program.test(null); 
      //Program.test(); // <<< Error. 
      // "No overload for method 'test' takes 0 arguments" 
      // So don't mistake nullable to be optional. 

      Console.WriteLine("Done. Return to quit"); 
      Console.Read(); 
     } 

     static public void test(DateTime? dteIn) 
     { 
      Console.WriteLine("#" + dteIn.ToString() + "#"); 
     } 
    } 
} 

đầu ra:

#1/1/0001 12:00:00 AM# 
## 
Done. Return to quit 
0

Bạn có thể sử dụng 2 cách: int? hoặc Nullable, cả hai đều có cùng một hành vi. Bạn có thể tạo ra một hỗn hợp mà không có vấn đề nhưng là một sự lựa chọn tốt hơn để làm cho mã sạch.

Phương án 1 (Với?):

private void Example(int? arg1, int? arg2) 
    { 
     if (arg1.HasValue) 
     { 
      //do something 
     } 
     if (arg1.HasValue) 
     { 
      //do something else 
     } 
    } 

Lựa chọn 2 (Với Nullable):

private void Example(Nullable<int> arg1, Nullable<int> arg2) 
    { 
     if (arg1.HasValue) 
     { 
      //do something 
     } 
     if (arg1.HasValue) 
     { 
      //do something else 
     } 
    } 

Từ C# 4.0 được đưa ra một cách mới để làm điều tương tự với sự linh hoạt hơn, trong này trường hợp khung cung cấp optional parameters with default values, theo cách này, bạn có thể đặt giá trị mặc định nếu phương thức được gọi mà không có tất cả các tham số.

Lựa chọn 3 (Với giá trị mặc định)

private void Example(int arg1 = 0, int arg2 = 1) 
    { 
     //do something else 
    } 
Các vấn đề liên quan