[问题] 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