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