[問題] public DateTime? aaa { get; set; }

作者: talkmyself (音容苑在)   2022-11-15 09:30:18
public class bbb
{
public DateTime? aaa { get; set; }
}
請問中間的? 是什麼意思 有類似的可以參考嗎?
google 關鍵字會把? 清掉
作者: testPtt (測試)   2022-11-15 09:36:00
可空
作者: nicetw20xx (哇愛台灣)   2022-11-15 13:49:00
Nullable value types
作者: MickeyHowl (Mickeyhowl)   2022-11-17 19:10:00
可為null
作者: testPtt (測試)   2022-11-17 19:26:00
我想問為什麼一開始不設計成預設null就好 有沒有人解答
作者: lonniekao (free myself)   2022-11-17 22:20:00
不同狀態都會有使用情境,例如不可為null,在資料轉進model就可知道,是否有問題,不需要等到執行運算才處理。
作者: testPtt (測試)   2022-11-18 11:36:00
我覺得nullable會比較常用 打?的頻率太高覺得這設計不好
作者: j835111   2022-11-18 16:52:00
DateTime類型default不能為null,多個問號把他轉成nullable類型
作者: lonniekao (free myself)   2022-11-18 22:47:00
不是你覺得就是對的,有沒想過會不會是你見過的太少?
作者: testPtt (測試)   2022-11-18 23:28:00
可能是我大部分的應用都跟資料庫有關 都需要nullable大部分的情況下我宣告物件都會給null 直接new的不多所以我會希望type預設nullable 用別的方式表示not null
作者: ssccg (23)   2022-11-21 01:59:00
因為value type不是reference type,本來就沒有所謂nullvalue type就像C/C++的struct,值是直接存在stack上的,而null代表的是reference type或像C/C++的pointer沒有指向物件value type宣告時就佔了一塊記憶位置,裡面不管值是多少一定會有值,而不是指向什麼物件,所以不會有沒指向的情況Nullable不只是個標記,而是一層包裝,把value type轉成了reference type,把原本存在stack上的值包成一個物件丟到heap上,取值不再是直接讀而要多解一層reference在Java,只有primitive type是value type,其他所有Class都是reference type,而C#支援struct這種較複雜的value type然後C#的日期時間類別都是struct為什麼預設是value type,因為value type就是省記憶體也快(在stack上是指method local variable,其他情況看scope)
作者: lonniekao (free myself)   2022-11-21 06:58:00
ssccg,很讚的解說。
作者: testPtt (測試)   2022-11-21 19:08:00
那麻煩再解說一下string vs string? XD好像任何class都可以加?
作者: sating00 (sating00)   2022-11-21 19:28:00
https://is.gd/x0p6AA官方文件看來,nullable 的類別會有一些限制。前面推文說的 string?,也許在特定情況可能派得上用場雖然個人真的不太常使用到,但是csharp能夠有這種方法總是有方便的地方,有總比沒有好另外前面版友提到的,為什麼不要全部都是nullable,ssccg 的解釋可以好好參考,基本的型態在資料賦值的時候是拷貝,nullable就變成參考(可能理解有錯,再請前輩訂正),在這種情形下會造成寫程式上的麻煩,讓基本型態就維持基本型態,真的需要使用的時候才考慮nullable
作者: ssccg (23)   2022-11-21 22:59:00
reference type的nullable就完全是同一個類型,只是可以啟用compiler檢查,在把nullable值設給非nullable變數時警告避免寫出執行期才發現NullPointerException的程式有些語言預設就是這種模式如Kotlin和Swift
作者: CloudyWing (孤單ㄉ翼)   2021-01-10 19:17:00
DateTime?是Nullable<DateTime>的簡寫,至於ref type和value type差異上面有提了,順便一提Nullable雖然可以設為null,但它仍然是struct,只是編譯器有動手腳讓他看起來有支援nullC#的struct是用於在一些單純表達值的型別上,不希望更動到一個變數的內容,結果全部相同的ref的變數值都被改了,像Java的Date是ref type,就被人提過是失敗的設計struct不同的變數是獨立,而非指向同個refNull的存在一直有爭議,很多錯誤都是源自於null值,但這又是有歷史包袱的東西,所以C#就提供ref type Nullable的檢查,它可以在csproj設定是否要啟用,啟用的話,沒有?表示你認為他一定不為null,有?則是有可能是null,另外還有一些Attribute可以表示可能是Null,但是這邊不該是Null,或是結尾加!表示這地方一定不為null然後非Oracle的資料庫有一派的設計是非必要,否則欄位都設NOT NULL,字串型別都用空字串取代Null,列舉類的資料都會定義一個值來做default值,只有例如審核時間這種沒有審核就不會有值的才設可Null,極端一點的就給default 1900/01/01

Links booklink

Contact Us: admin [ a t ] ucptt.com