2009-04-03 68 views
7

Tôi luôn luôn nhầm lẫn với các cách thể hiện null khác nhau. Có kiểu tham chiếu null (còn gọi là "null"). Sau đó, tôi đã thấy rằng trong suốt ứng dụng của tôi, các nhà phát triển đã sử dụng MinValue để biểu thị các giá trị rỗng. Ví dụ: Double.MinValue hoặc DateTime.MinValue ngoại trừ một Chuỗi mà họ sử dụng "null"Lẫn lộn với NULL trong C#

Sau đó, có System.DBNull (và System.DBNull.Value - không chắc chắn nên sử dụng khi nào). Để thêm vào sự nhầm lẫn, cũng có các không gian tên System.NullableSystem.Nullable<T>.

Ai đó có thể giúp tôi xóa sự nhầm lẫn vô hiệu này không?

Cảm ơn

Trả lời

27

Chắc chắn.

System.DBNull là lớp được (và vẫn) được sử dụng bởi ADO.NET để biểu thị giá trị null trong cơ sở dữ liệu.

null thực sự là một tài liệu tham khảo null, và trong mã ứng dụng của bạn bất kỳ loại tài liệu tham khảo nên sử dụng null như, tốt, null giá trị của nó.

Cách sử dụng MinValue đối với các loại nguyên thủy khác nhau (vì chúng là loại giá trị không thể được gán null) ngày trở lại vào những ngày đen tối trước C# 2.0. Bây giờ, phương pháp ưa thích để biểu diễn một kiểu nguyên thủy nullable là sử dụng kiểu generic Nullable<T>, thường được biểu diễn bằng viết tắt với dấu chấm hỏi sau kiểu nguyên thủy. Ví dụ, tôi có thể khai báo một biến int nullable tên foo trong C# như:

Nullable<int> foo; 

hoặc

int? foo; 

Cả hai đều giống hệt nhau.

+0

Cảm ơn bạn đã định dạng! ;) –

+0

độc đáo thực hiện - rõ ràng và thông tin – annakata

0

"MinValue" s đã được sử dụng với các loại giá trị trước khi loại có thể vô hiệu hóa xuất hiện trong C# 2.0. Vì vậy, có rất nhiều mã kế thừa sử dụng kiểu cũ khi biết khi một loại giá trị không có giá trị. Ngày nay, việc sử dụng DateTime? date = null trở nên dễ dàng hơn nhiều so với DateTime date = DateTime.MinValue. Theo như DBNull đi, đó là một cái gì đó là cần thiết như một lớp trừu tượng để cơ sở dữ liệu, nhưng bạn có thể tránh phải đối phó với nó cho mình bằng cách sử dụng một ORM như NHibernate hoặc một số như vậy - bạn khá nhiều, từ một ứng dụng. quan điểm phát triển sẽ chỉ phải đối phó với các kiểu C# dựng sẵn.

0

MinValue không phải là rỗng. Đó là MinValue. Nó đôi khi được sử dụng "như null" bởi những người sử dụng C# 1.0, mà không có kiểu giá trị nullable. Thay vào đó, họ nên sử dụng Nullable, ot DateTime ?.

DBNull là giá trị .NET được sử dụng để giao tiếp với cơ sở dữ liệu ("DB" null). Khái niệm cơ sở dữ liệu của NULL có nghĩa là một cái gì đó khác với tham chiếu .NET. Trong thuật ngữ cơ sở dữ liệu, NULL có nghĩa là "không xác định" hoặc "vắng mặt".

+0

DBNull trong điều khoản cơ sở dữ liệu có nghĩa là giống như null trong C# điều khoản, nó chỉ là khi. Net 1.x ra không có loại nullable, như Generics đã được giới thiệu trong phiên bản 2. – Tracker1

+0

Xin lỗi, đó không phải là trường hợp. NULL trong cơ sở dữ liệu quan hệ có nghĩa là "không xác định" hoặc "không có thông tin". Hãy suy nghĩ của một OUTER tham gia với không có hàng phù hợp trong bảng thứ hai - cột từ bảng đó sẽ được trả về như NULL, có nghĩa là không có mặt. –

1
  • null cho các loại tài liệu tham khảo về giá trị thực tế rỗng
  • Nullable, bổ sung trong .NET 2.0 là một cách thể hiện null cho giá trị loại, mà theo định nghĩa không thể null.
  • Tương tự với DateTime.MinValue - Ngày giờ là loại giá trị và không thể là không, vì vậy bạn có thể có quy ước rằng một giá trị nổi tiếng, như DateTime.MinValue được coi như là là không. Nó cũng có các tập quán khác.
+0

Tôi sẽ tranh luận về điểm cuối cùng ... DBNull không được thay thế bằng kiểu Nullable. – Cerebrus

+0

DateTime.MinValue không chỉ là quy ước. Đó là giá trị của biến DateTime nếu chưa có gì được gán cho nó. –

+0

@Cerbrus: Tôi cũng sẽ tranh luận về điểm cuối cùng. DBNull không đại diện cho null trong C#, nhưng trong cơ sở dữ liệu. Trong khi Nullable là null trong C#. – Samuel

1

Giá trị Null đại diện cho bất kỳ đối tượng loại tham chiếu nào chưa được cấp phát bộ nhớ.

MinValue không đại diện cho Null, thay vào đó là thuộc tính thường được sử dụng để thể hiện giá trị hằng số nhỏ nhất có thể mà một loại giá trị nhất định có thể có.

Lớp DBNull.Value là ánh xạ của Nulls được trả về/được chuyển đến cơ sở dữ liệu.

Loại chung chung cho phép bạn chỉ định giá trị Null cho loại Giá trị.

0

Loại tham chiếu (còn gọi là đối tượng) có thể được đặt thành rỗng vì biến loại tham chiếu chỉ là một con trỏ đến thực thể. Chỉ ra việc thiếu một thể hiện rất dễ dàng vì bạn có thể đặt biến thành null một cách trực tiếp.

Đối với các loại giá trị, điều này hơi khó hơn vì biến loại giá trị luôn chứa giá trị. Do đó, việc sử dụng Double.MinValue hoặc DateTime.MinValue có phần hợp lệ trong những ngày trước Nullable. Quay lại sau đó không có cách nào dễ dàng để thể hiện sự thiếu giá trị trong các loại giá trị.

Bây giờ, với các loại nullable bạn có thể nói:

double? d = null; 

Và như vậy, bạn cũng có thể đã biến kiểu giá trị chứa null.

System.DBNull là một câu chuyện khác vì nó được gắn trực tiếp để biểu thị giá trị "NULL" trong tập dữ liệu. Điều này đã được giới thiệu trước khi loại nullable mà imo thay thế DBNull.

0

Hầu hết các loại trong .NET là tham chiếu loại và null là "không tham chiếu" có thể được gán cho biến hoặc trường để cho biết không có đối tượng.

Tất cả các loại khác trong .NET là các loại giá trị. Luôn luôn có một giá trị với một loại giá trị, do đó không có khả năng chỉ ra "không có giá trị". Do đó, việc triển khai có thể xác định các giá trị đặc biệt cụ thể để chỉ ra điều này. Thường thì trường giá trị loại MinValue (hằng số) được sử dụng cho điều này. Vì vậy, việc sử dụng DateTime.MinValue để có ngày sinh có thể cho biết "không xác định" hoặc "không áp dụng" (ví dụ: đối với pháp nhân công ty).

DbNUll tồn tại để thể hiện ý nghĩa của RDBMS là NULL có một chút khác biệt với .NET. Trong hầu hết các trường hợp, điều này sẽ được dịch thành null hoặc tương tự.

Cuối cùng, Nullable<T> là một wrapper với nhiều loại giá trị trực tiếp hơn tốc hành "không biết", và nói chung là một lựa chọn tốt hơn so với sử dụng MinValue, nhưng đã được bổ sung trong NET 2, do thiết kế cũ có thể đã bắt đầu sử dụng MinValue trước Nullable<T> có sẵn.

0

cách tốt nhất cho tou để hiểu được điều này các giá trị null khác nhau là để thử chúng và xem những gì việc sử dụng của mỗi người nhưng để làm cho mọi việc đơn giản đây là một số hướng dẫn

  • null có thể được sử dụng trên các loại tài liệu tham khảo như các bộ sưu tập và các lớp tùy chỉnh (chuỗi là đặc biệt)
  • DBNull là cho các giá trị rỗng xuất phát từ truy vấn db.
  • bởi vì chúng ta không thể gán null tới một số thập phân hoặc gấp đôi chúng ta gán chúng với các tài sản MINVALUE (họ là những vật giá trị)

  • Nullable là một cách để các nhà phát triển để gán giá trị null để đối tượng có giá trị như chữ số thập phân, Nullable<int> is same as int?


tôi hy vọng tôi đã giúp bạn hiểu sự khác biệt.

5
  • null chỉ có giá trị tham khảo loại: loại mà là một class chứ không phải là một structure.
  • . Net cũng có các loại giá trị: int, double, DateTime, v.v. Các loại giá trị không thể rỗng, vì vậy bạn thường so sánh chúng với giá trị mặc định của chúng, thường là type.MinValue, nhưng có thể là một cái gì đó (xem Boolean, thí dụ).
  • Nullable<T> là khi bạn có loại giá trị có thể thực sự là rỗng. Giá trị mặc định (có thể là MinValue) cũng hợp lệ và bạn cần phải phân biệt giá trị đó khi biến chưa được gán. Trong C#, bạn có thể sử dụng? với loại giá trị dưới dạng ký hiệu viết tay ngắn (ví dụ: int?), nhưng bạn vẫn đang tạo cùng một kiểu Nullable<T>.
  • DBNull đề cập cụ thể đến giá trị NULL từ cơ sở dữ liệu. Nó không phải là điều tương tự như sử dụng null ở nơi khác trong ngôn ngữ: nó chỉ để nói chuyện với một cơ sở dữ liệu để bạn có thể biết khi nào một truy vấn trả về một giá trị null.
  • Khi sử dụng generics, bạn cũng sẽ thấy cấu trúc default(T) được sử dụng, trong đó T là thông số loại. Điều này cho phép bạn đặt giá trị mặc định của loại mà không biết loại đó là loại tham chiếu hay loại giá trị, giá trị mặc định của loại giá trị cụ thể ít hơn nhiều.
0

Sự khác biệt quan trọng ở đây là giữa các loại giá trị và loại tham chiếu. Các loại giá trị thể hiện trực tiếp một giá trị nhất định, trong khi các loại tham chiếu trỏ đến vị trí bộ nhớ cần biểu thị một giá trị. Khi một kiểu tham chiếu thực sự không trỏ đến một vị trí bộ nhớ có nội dung hợp lệ, tham chiếu là Null.

Vì các loại giá trị là đại diện trực tiếp của giá trị, chúng không thể là rỗng. Tuy nhiên, có thể là trường hợp giá trị thực tế của loại giá trị không xác định. Trong trường hợp này, .Net cung cấp cấu trúc kiểu Nullable. Tuy nhiên, khi một cấu trúc như vậy không có sẵn, mọi người có xu hướng sử dụng các giá trị đặc biệt hoặc mặc định, chẳng hạn như MinValue.

Khi giao tiếp với cơ sở dữ liệu, rất nhiều thứ mà chúng tôi mong đợi là loại giá trị thực sự có thể là Null, vì đó là cách cơ sở dữ liệu xử lý các giá trị không xác định. Điều này cũng có thể được giải quyết bằng các kiểu Nullable, nhưng không phải lúc nào cũng có sẵn. Đó là lý do tại sao DBNull tồn tại, để đối phó với một null có thể có trong một cơ sở dữ liệu.