作者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/cn.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