日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Nullable<T>、Nullable、null、?修饰符的区别

發布時間:2024/6/21 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 Nullable<T>、Nullable、null、?修饰符的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這章我們討論一下Nullable<T>、Nullable、null、?修飾符的區別

原創文章

Nullable<T>的前世今生

討論它們之前,我們有必要討論一下Nullable<T>的前世今生,目的也是為了讓我們更好地了解他們的區別,加深印象。
在C#2以前,有一個問題經常會困擾我們,相信大部分人都想過此問題。
在數據庫中,比如設置一個表如下(電腦表Computer)

字段名 類型 是否允許空值
Color varchar Y
Age int N
CpuSpeed int Y
CreateDate DateTime Y
Power int Y

對于Age是int類型,不能允許空值還好說,因為插入數據庫時會提示Age要有值才能插入。對于CpuSpeed、CreateDate、Power都是值類型,在程序中不能設置空值,比如int CpuSpeed=null,是不允許的。
那么我們以前是怎么解決這種問題的存在呢?
答:'給個默認值=空值'
比如,CreateDate=DateTime.MinValue。表示空值。
這種做法雖然開起來不錯,但是顯然是在程序設計時要規定好的,容易讓人困擾。當新的程序員要接手你的代碼時,表示很危險。
那么C#怎么解決這種問題的存在呢?答案就在C#2中引入了Nullable<T>
對于上面的CpuSpeed、CreateDate、Power我們可以在C#中這樣來定義:

public Nullable<int> CpuSpeed;
public Nullable<DateTime> CreateDate;
public Nullable<int>Power;

這樣,我們就很好的與數據庫那邊打交道了。

Nullable<T>、Nullable、null、?修飾符的區別

Nullable<T>其實就等于?修飾符。比如上面的 public Nullable<int> CpuSpeed;等價于public int? CpuSpeed;
修飾符?是Nullable<T>的簡寫,請參考上面
Nullable<T>是一個結構structs,Nullable是一個靜態類。他們結構類型上已經不同。也就是說Nullable<T>是值類型,Nullable是引用類型。
可以看到源代碼:

public struct Nullable<T> where T : struct
public static class Nullable

Nullable其實顯得有點多余,因為它更多意義上是修飾了Nullable<T>的用法。但是Nullable實現了Nullable<T>很多實用功能。
null是表示空值,與Nullable<T>、Nullable沒有特別的關聯。

null、Nullable<T>

我們有必要說一下null、Nullable<T>的關聯。
我們都知道,當比較一個值類型==null時,永遠都為false,因為null '一般表示引用類型為null'。
用例子來說明一下吧,創建一個電腦Entity類:

public class Computer
{
    public string Color;
    public int Age;
    public int? CpuSpeed;
    public DateTime? CreateDate; 
    public int? Power;
}
我們來試試比較一下null、Nullable<T>的值是否相等。
第一個需要比較的是,如果Nullable<T>有值時,是否與null的判斷,如下:

Computer computer1 = new Computer();
computer1.CpuSpeed = new Nullable();
Console.WriteLine("new Nullable()==new Nullable() " + (computer1.CpuSpeed == new Nullable()));
Console.WriteLine("new Nullable()==null " + (computer1.CpuSpeed == null));

我們首先想想,上面會輸出什么呢?

new Nullable<int>()==new Nullable<int>() 肯定是true啦,不用說
new Nullable<int>()==null 按照通常的理解,應該是false,但是這里確實輸出true。
為什么呢?哈哈哈,這有點意思呢,我們來看看Nullable<T>的源代碼吧:

 public override bool Equals(object other) {
        if (!hasValue) return other == null;
        if (other == null) return false;
        return value.Equals(other);
    }
看第一行,如果沒有值并且other為null就返回true。所以我們就明白了為什么新建一個沒有值的Nullable<T>時等于null

到此解析結束了。 請轉載本文注明轉載處與作者。

可以關注本人的公眾號,多年經驗的原創文章共享給大家。

總結

以上是生活随笔為你收集整理的Nullable&lt;T&gt;、Nullable、null、?修饰符的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。