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

看板C_Sharp (C#)作者 (休息中)時間2年前 (2022/11/15 09:30), 編輯推噓8(8058)
留言66則, 8人參與, 3年前最新討論串1/1
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

11/15 09:36, 2年前 , 1F
可空
11/15 09:36, 1F

11/15 13:49, 2年前 , 2F
Nullable value types
11/15 13:49, 2F

11/17 19:10, 2年前 , 3F
可為null
11/17 19:10, 3F

11/17 19:26, 2年前 , 4F
我想問為什麼一開始不設計成預設null就好 有沒有人解答
11/17 19:26, 4F

11/17 22:20, 2年前 , 5F
不同狀態都會有使用情境,例如不可為null,在資料轉進
11/17 22:20, 5F

11/17 22:20, 2年前 , 6F
model就可知道,是否有問題,不需要等到執行運算才處
11/17 22:20, 6F

11/17 22:20, 2年前 , 7F
理。
11/17 22:20, 7F

11/18 11:36, 2年前 , 8F
我覺得nullable會比較常用 打?的頻率太高覺得這設計不好
11/18 11:36, 8F

11/18 16:52, 2年前 , 9F
DateTime類型default不能為null,多個問號把他轉成nullab
11/18 16:52, 9F

11/18 16:52, 2年前 , 10F
le類型
11/18 16:52, 10F

11/18 22:47, 2年前 , 11F
不是你覺得就是對的,有沒想過會不會是你見過的太少?
11/18 22:47, 11F

11/18 23:28, 2年前 , 12F
可能是我大部分的應用都跟資料庫有關 都需要nullable
11/18 23:28, 12F

11/18 23:33, 2年前 , 13F
大部分的情況下我宣告物件都會給null 直接new的不多
11/18 23:33, 13F

11/18 23:36, 2年前 , 14F
所以我會希望type預設nullable 用別的方式表示not null
11/18 23:36, 14F

11/21 01:59, 2年前 , 15F
因為value type不是reference type,本來就沒有所謂null
11/21 01:59, 15F

11/21 01:59, 2年前 , 16F
value type就像C/C++的struct,值是直接存在stack上的,而
11/21 01:59, 16F

11/21 02:01, 2年前 , 17F
null代表的是reference type或像C/C++的pointer沒有指向物
11/21 02:01, 17F

11/21 02:02, 2年前 , 18F
11/21 02:02, 18F

11/21 02:03, 2年前 , 19F
value type宣告時就佔了一塊記憶位置,裡面不管值是多少一
11/21 02:03, 19F

11/21 02:04, 2年前 , 20F
定會有值,而不是指向什麼物件,所以不會有沒指向的情況
11/21 02:04, 20F

11/21 02:05, 2年前 , 21F
Nullable不只是個標記,而是一層包裝,把value type轉成了
11/21 02:05, 21F

11/21 02:05, 2年前 , 22F
reference type,把原本存在stack上的值包成一個物件丟到
11/21 02:05, 22F

11/21 02:08, 2年前 , 23F
heap上,取值不再是直接讀而要多解一層reference
11/21 02:08, 23F

11/21 02:09, 2年前 , 24F
在Java,只有primitive type是value type,其他所有Class都
11/21 02:09, 24F

11/21 02:10, 2年前 , 25F
是reference type,而C#支援struct這種較複雜的value type
11/21 02:10, 25F

11/21 02:16, 2年前 , 26F
然後C#的日期時間類別都是struct
11/21 02:16, 26F

11/21 02:24, 2年前 , 27F
為什麼預設是value type,因為value type就是省記憶體也快
11/21 02:24, 27F

11/21 02:31, 2年前 , 28F
(在stack上是指method local variable,其他情況看scope)
11/21 02:31, 28F

11/21 06:58, 2年前 , 29F
ssccg,很讚的解說。
11/21 06:58, 29F

11/21 19:08, 2年前 , 30F
那麻煩再解說一下string vs string? XD
11/21 19:08, 30F

11/21 19:11, 2年前 , 31F
好像任何class都可以加?
11/21 19:11, 31F

11/21 19:28, 2年前 , 32F
11/21 19:28, 32F

11/21 19:28, 2年前 , 33F
官方文件看來,nullable 的類別會有一些限制。前面推文
11/21 19:28, 33F

11/21 19:28, 2年前 , 34F
說的 string?,也許在特定情況可能派得上用場
11/21 19:28, 34F

11/21 19:37, 2年前 , 35F
雖然個人真的不太常使用到,但是csharp能夠有這種方法
11/21 19:37, 35F

11/21 19:37, 2年前 , 36F
總是有方便的地方,有總比沒有好
11/21 19:37, 36F

11/21 19:42, 2年前 , 37F
另外前面版友提到的,為什麼不要全部都是nullable,
11/21 19:42, 37F

11/21 19:42, 2年前 , 38F
ssccg 的解釋可以好好參考,基本的型態在資料賦值的時
11/21 19:42, 38F

11/21 19:42, 2年前 , 39F
候是拷貝,nullable就變成參考(可能理解有錯,再請前輩
11/21 19:42, 39F

11/21 19:42, 2年前 , 40F
訂正),在這種情形下會造成寫程式上的麻煩,讓基本型態
11/21 19:42, 40F

11/21 19:42, 2年前 , 41F
就維持基本型態,真的需要使用的時候才考慮nullable
11/21 19:42, 41F

11/21 22:59, 2年前 , 42F
reference type的nullable就完全是同一個類型,只是可以啟
11/21 22:59, 42F

11/21 23:01, 2年前 , 43F
用compiler檢查,在把nullable值設給非nullable變數時警告
11/21 23:01, 43F

11/21 23:05, 2年前 , 44F
避免寫出執行期才發現NullPointerException的程式
11/21 23:05, 44F

11/21 23:07, 2年前 , 45F
有些語言預設就是這種模式如Kotlin和Swift
11/21 23:07, 45F

01/10 19:17, 3年前 , 46F
DateTime?是Nullable<DateTime>的簡寫,至於ref type
01/10 19:17, 46F

01/10 19:17, 3年前 , 47F
和value type差異上面有提了,順便一提Nullable雖然
01/10 19:17, 47F

01/10 19:17, 3年前 , 48F
可以設為null,但它仍然是struct,只是編譯器有動手
01/10 19:17, 48F

01/10 19:17, 3年前 , 49F
腳讓他看起來有支援null
01/10 19:17, 49F

01/10 19:22, 3年前 , 50F
C#的struct是用於在一些單純表達值的型別上,不希望
01/10 19:22, 50F

01/10 19:22, 3年前 , 51F
更動到一個變數的內容,結果全部相同的ref的變數值都
01/10 19:22, 51F

01/10 19:22, 3年前 , 52F
被改了,像Java的Date是ref type,就被人提過是失敗
01/10 19:22, 52F

01/10 19:22, 3年前 , 53F
的設計
01/10 19:22, 53F

01/10 19:23, 3年前 , 54F
struct不同的變數是獨立,而非指向同個ref
01/10 19:23, 54F

01/10 19:28, 3年前 , 55F
Null的存在一直有爭議,很多錯誤都是源自於null值,
01/10 19:28, 55F

01/10 19:28, 3年前 , 56F
但這又是有歷史包袱的東西,所以C#就提供ref type Nu
01/10 19:28, 56F

01/10 19:28, 3年前 , 57F
llable的檢查,它可以在csproj設定是否要啟用,啟用
01/10 19:28, 57F

01/10 19:28, 3年前 , 58F
的話,沒有?表示你認為他一定不為null,有?則是有可
01/10 19:28, 58F

01/10 19:28, 3年前 , 59F
能是null,另外還有一些Attribute可以表示可能是Null
01/10 19:28, 59F

01/10 19:28, 3年前 , 60F
,但是這邊不該是Null,或是結尾加!表示這地方一定不
01/10 19:28, 60F

01/10 19:28, 3年前 , 61F
為null
01/10 19:28, 61F

01/10 19:45, 3年前 , 62F
然後非Oracle的資料庫有一派的設計是非必要,否則欄
01/10 19:45, 62F

01/10 19:45, 3年前 , 63F
位都設NOT NULL,字串型別都用空字串取代Null,列舉
01/10 19:45, 63F

01/10 19:45, 3年前 , 64F
類的資料都會定義一個值來做default值,只有例如審核
01/10 19:45, 64F

01/10 19:45, 3年前 , 65F
時間這種沒有審核就不會有值的才設可Null,極端一點
01/10 19:45, 65F

01/10 19:45, 3年前 , 66F
的就給default 1900/01/01
01/10 19:45, 66F
文章代碼(AID): #1ZSkkiN8 (C_Sharp)
文章代碼(AID): #1ZSkkiN8 (C_Sharp)