Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[C#2] 4-可空类型、静态类

[C#2] 4-可空类型、静态类

作者头像
blackheart
发布于 2018-01-19 08:18:59
发布于 2018-01-19 08:18:59
83900
代码可运行
举报
文章被收录于专栏:blackheart的专栏blackheart的专栏
运行总次数:0
代码可运行

1. 可空类型

值类型是不可以为null的[即不可为空值], 假如我们想让它为null呢[比如它对映这数据库中的某个表的某个字段,但是这个字段是null]。 自己实现的话,简单的写一个类,有一个值类型的字段,检查该字段是否初始化,是的话返回该值,否的话返回null。 假如是在C#1.0时,那么每个值类型都要写这么一份代码了。C#2.0有了泛型的支持,所以我们可以定义一个泛型版的。 幸运的是C#2.0带来了一个新的类型[System.Nullable<T>]帮我们实现了,T就是需要传入的类型[约束为值类型]. 比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Nullable<int> i=null;   
//简写?
int? i=null;

下面是System.Nullable<T>泛型类原型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 [Serializable]//表示了序列化
 2 public struct Nullable<T> where T : struct
 3 {
 4     //构造器,初始化类型参数T
 5     public Nullable(T value);
 6     //重载类型转换操作符<显示转换:int i=(int)Nullable<int>类型变量>
 7     public static explicit operator T(T? value);
 8     //重载类型转换操作符<隐式转换:int? i=int类型变量>
 9     public static implicit operator T?(T value);
10     //判断是否是null,
11     public bool HasValue { get; }
12     //如果不是null,取得值
13     public T Value { get; }
14     //重写Equals
15     public override bool Equals(object other);
16     //重写GetHashCode
17     public override int GetHashCode();
18     //如果HasValue属性为true,返回Value属性的值
19     //否则返回当前 Nullable<T> 对象<类型是T>的默认值
20     //即使 HasValue属性为false,GetValueOrDefault方法也会返回一个值
21     //(这与 Value 属性不同,该属性将引发异常)。
22     public T GetValueOrDefault();
23     //同上,参数是指定的默认值,如果int? i=null;
24     //int j=i.GetValueOrDefault(10);则j的值为10
25     public T GetValueOrDefault(T defaultValue);
26     //重写ToString
27     public override string ToString();
28 }

各个方法使用DEMO:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static void Main()
{
    Nullable<int> i = null;
    int l = i.GetValueOrDefault();//l=0
    int n = i.GetValueOrDefault(10);//j=10
    int h = i.HasValue ? i.Value : default(int);//h=0
    int m = 100;
    i = m;//隐式转换
    m = (int)i;//显示转换  
    Console.WriteLine(i.Equals(m));//true
    Console.WriteLine(i.GetType());//System.Int32
    Console.WriteLine(i.ToString());//100
}

现在做些运算:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static void Main()
{
    Nullable<int> i = 1;
    int? j = 2;
    //执行运算之前会先调用HasValue属性
    int l = (int)(i + j);
    Console.WriteLine(l);//3
    i = null;
    //抛出异常System.InvalidOperationException
    //其中一个为null则结果就为null,所以null无法转换为int
    int n = (int)(i + j);  
    Console.WriteLine(n);
}

它的这些运算还是蛮繁琐的,先检查是否为null,如果都不是null,再取得各自的值在运算,否则返回null。 不是迫不得已的情况下最好不使用[效率不怎么好]。

2. 静态类

静态类是只用于包含静态成员,它既不能实例化,也不能被继承。 它相当于一个sealed abstract类[查看IL代码实际上静态类就是被标识为sealed和abstract]。 相当于提供一些功能性的全局函数[C#不支持全局函数,但是CLR支持,IL支持,这算是一种变相的实现全局函数吧]。

静态类不能有实例构造器;

静态类不能有任何实例成员;

静态类上不能使用abstract或sealed修饰符;

静态类默认继承自System.Object根类,不能显式指定任何其他基类[实际上也没有什么意义的];

静态类不能指定任何接口实现。;

静态类的成员不能有protected 或 protected internal访问保护修饰符[这些都是供子类访问的,但是静态类不允许被继承,所以你用这些访问修饰符没有任何意义]。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011-04-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C# 中比较实用的关键字,基础高频面试题!
在C#编程中关键字是构建逻辑和实现功能的基石,它承载着编程语言的语法规则和编程智慧。熟练掌握这些基础高频关键字对提升编程能力和面试表现至关重要,它们是日常开发和解决复杂问题的关键。
追逐时光者
2025/03/22
750
C# 中比较实用的关键字,基础高频面试题!
C#反射与特性(九):全网最全-解析反射
C# 中的访问修饰符:public、private、protected、internal、protected internal。
痴者工良
2021/04/26
2.1K0
C# int? 关键字
1、int?  关键字说明 (1)、int? 表示一个int类型,且该int类型可空,如果不加?的话,那么int类型的默认值为0,不能赋null值,代码如下: int aa = null; (2)
郑小超.
2018/01/26
1K0
C#2.0增功能04 可以为 null 的类型
  可以为 null 的类型是 System.Nullable<T> 结构的实例。 可以为 null 的类型可表示一个基础类型的所有值 T,还可以再表示一个 null 值。 基础类型 T 可以是任何不可为 null 的值类型。 T 不能是引用类型。
张传宁IT讲堂
2019/09/17
6100
[读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器
前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法。 另外C#2.0还提出了可空类型,匿名方法和迭代器3个优美的特性。 1,泛型 1.1 泛型是什么 泛型的英文表述是"generic", 这个单词意为通用的。从字面意思可知,泛型代表的就是"通用类型",它可以代替任意的数据类型,使类型参数化, 从而达到之实现一个方法就可以操作多种数据类型的目的。泛型是将方法实现行为与方法操作的数据类型分离,实现了代码重用。
一枝花算不算浪漫
2018/05/18
1.3K0
可空类型及其衍生运算符
我们知道,值类型在使用前必须设置值,而引用类型则可以是null,但在某些情况下,为值类型设置为空是必要的(如处理数据库数据的时候),微软因此推出了可空类型 System.Nullable<T> 这是一个泛型类,其中,T就代表一个具体的值类型。
宿春磊Charles
2022/03/29
4220
可空类型及其衍生运算符
C#关键字常见面试题
不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步(文章中有描述不当的地方欢迎文末留言指正,我会及时改正🤞)。
追逐时光者
2024/02/22
2100
C#关键字常见面试题
《CLR via C#》笔记:第3部分 基本类型(3)
本博客所总结书籍为《CLR via C#(第4版)》清华大学出版社,2021年11月第11次印刷(如果是旧版书籍或者pdf可能会出现书页对不上的情况) 你可以理解为本博客为该书的精简子集,给正在学习中的人提供一个“glance”,以及对于部分专业术语或知识点给出解释/博客链接。 【本博客有如下定义“Px x”,第一个代表书中的页数,第二个代表大致内容从本页第几段开始。(如果有last+x代表倒数第几段,last代表最后一段)】 电子书可以在博客首页的文档-资源归档中找到,或者点击:传送门自行查找。如有能力
[Sugar]
2022/09/21
9510
int? 竟然真的可以是 null!.NET/C# 确定可空值类型 Nullable 实例的真实类型
使用 Nullable<T> 我们可以为原本不可能为 null 的值类型像引用类型那样提供一个 null 值。不过注意:Nullable<T> 本身也是个 struct,是个值类型哦。这意味着你随时可以调用 .HasValue 这样的方法,而不用担心会出现 NullReferenceException。
walterlv
2020/02/10
1.5K0
C#基础篇——泛型
在开发编程中,我们经常会遇到功能非常相似的功能模块,只是他们的处理的数据不一样,所以我们会分别采用多个方法来处理不同的数据类型。但是这个时候,我们就会想一个问题,有没有办法实现利用同一个方法来传递不同种类型的参数呢?
zls365
2021/04/23
1.3K0
C#基础篇——泛型
[读书笔记]C#学习笔记三: C#类型详解..
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. 再会有三篇博客  这个系列的就会结束了. 也算是自己对园子中@Learning Hard出版的<<C#学习笔记>>的一个总结了. 博客内容基本上都是白天抽空在公司写好的了, 但是由于公司内部网络不能登录博客园所以只能够夜晚拿回来修改,  写的不好或者不对的地方也请各位大神指出. 在下感激不尽了.  1,值类型和
一枝花算不算浪漫
2018/05/18
1.3K0
那些年~~~我们的C#笔试内测题目
《深入.NET平台和C#编程》内部测试题-笔试试卷 一 选择题 1) 以下关于序列化和反序列化的描述错误的是( C)。 a) 序列化是将对象的状态存储到特定存储介质中的过程 b) 二进制格式化器的Serialize()和Deserialize()方法可以分别用来实现序列化和反序列 化过程 解析:BinaryFormatter c) 如果一个类可序列化,则它的子类和包含的各成员对象也一定可序列化 问题出在了子类,如果子类压根不能进行序列化操作,则会抛出异常 d) 标识一个类可以序列化要使用[Serializ
房上的猫
2018/03/14
2.5K0
C#基础知识系列七(base、this、new、override、abstract、virtual、static)
本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base、this、new、override、abstract、virtual以及针对static字段和static构造函数之间的执行问题。
aehyok
2018/08/31
6640
C#基础知识系列七(base、this、new、override、abstract、virtual、static)
C# 学习笔记(10)—— 可空类型、匿名方法、迭代器
泛型是 C# 2 众多特性的其中之一,C# 2 还提出了可空类型、匿名方法和迭代器三个重要特性
Karl Du
2023/10/20
2190
C#历代版本新特性——面试题常用
掌握一门语言,当然要掌握它的特性,而随着C#历代版本的迭代更替,C#语言也日趋完善,在C#2.0~C#4.0版本所带来的新的语法特性格外重要。C#的新特性,其本质都是“语法糖”,目的是提升开发效率,在编译时会被编译器转成原始语法。下面按照版本顺序依次介绍其中在日常开发中比较常用的部分。 C# 1.0 特性 第1个版本,编程语言最基础的特性。 Classes:面向对象特性,支持类类型 Structs:结构 Interfaces:接口 Events:事件 Properties:属性,类的成员,提供访问字段
李郑
2018/03/06
2K0
.NET中可空值类型实现原理
为了让.Net中的值类型可以赋值为null,微软特地添加了Nullable<T>类型,也可简写为T?。但是Nullable<T>自身是结构体,也是值类型,那么它是如何实现将null赋值给值类型的呢?
雪飞鸿
2018/09/05
1.1K0
.NET中可空值类型实现原理
C# 9.0 中的新增功能
C# 9.0 引入了记录类型,这是一种引用类型,它提供合成方法来提供值语义,从而实现相等性。 默认情况下,记录是不可变的。
张传宁IT讲堂
2020/10/29
1.7K0
(保存)C#基础概念二十五问
注:本文部份资料来自网络,如有侵权,请与我联系,我会在第一时间声明引用或将其删除!     当初学 C# 时是找个人大概问了一下数据类型和分支语句就开始做项目了。这两天又全面的看了一下相关的基础知识(学而时习之嘛),总结了25个问题: 1.静态变量和非静态变量的区别? 2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 over
用户1172164
2018/01/16
1.1K0
(保存)C#基础概念二十五问
C# 中 Struct 和 Class 的区别总结
结构体(struct)是类(class)的轻量级版本。结构体是值类型,可用于创建行为类似于内置类型的对象。
zls365
2021/04/02
1.4K0
c#的细节(一)-问号的细节
本文主要介绍了关于C#中问号(?)的用法,包括作为三元操作符的替代方案,用于简化if语句,以及用于简化条件赋值。同时,还介绍了如何使用Nullable数据类型和双问号操作符来实现简化赋值和判断。
Jianbo
2018/01/08
9690
相关推荐
C# 中比较实用的关键字,基础高频面试题!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验