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