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

简介: 1. 可空类型 值类型是不可以为null的[即不可为空值], 假如我们想让它为null呢[比如它对映这数据库中的某个表的某个字段,但是这个字段是null]。 自己实现的话,简单的写一个类,有一个值类型的字段,检查该字段是否初始化,是的话返回该值,否的话返回null。

1. 可空类型

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

Nullable<int> i=null;   
//简写?
int? i=null;

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

 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:

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
}

现在做些运算:

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访问保护修饰符[这些都是供子类访问的,但是静态类不允许被继承,所以你用这些访问修饰符没有任何意义]。

作者: Blackheart
目录
相关文章
|
3月前
|
存储 安全 编译器
C# 11.0中的泛型属性:类型安全的新篇章
【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
|
7月前
|
编译器 C#
C#之十七 局部类型
C#之十七 局部类型
17 0
|
1月前
|
存储 C# 开发者
C#变量类型
C#变量类型
19 0
|
3月前
|
开发框架 .NET 编译器
C# 9.0中的目标类型新表达式:类型推断的又一进步
【1月更文挑战第16天】C# 9.0引入了目标类型新表达式,这是类型推断功能的一个重要扩展。通过目标类型新表达式,开发者在创建对象时可以省略类型名称,编译器会根据上下文自动推断所需类型。这一特性不仅简化了代码编写,还提高了代码的可读性和维护性。本文将详细介绍目标类型新表达式的语法、使用场景及其对C#编程的影响。
|
3月前
|
存储 C# 容器
掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南
变量是用于存储数据值的容器。 在 C# 中,有不同类型的变量(用不同的关键字定义),例如: int - 存储整数(没有小数点的整数),如 123 或 -123 double - 存储浮点数,有小数点,如 19.99 或 -19.99 char - 存储单个字符,如 'a' 或 'B'。Char 值用单引号括起来 string - 存储文本,如 "Hello World"。String 值用双引号括起来 bool - 存储具有两个状态的值:true 或 false
37 2
|
3月前
|
存储 安全 算法
C# 泛型:类型参数化的强大工具
【1月更文挑战第7天】本文将深入探讨C#语言中的泛型编程,包括泛型的定义、用途、优势以及实际应用。通过类型参数化,泛型允许开发者编写更加灵活且可重用的代码,同时提高程序的类型安全性和性能。本文将通过示例代码和详细解释,帮助读者更好地理解泛型在C#中的重要性和实用性。
|
4月前
|
存储 Java C#
【从Java转C#】第七章:运算符和类型强制转换
【从Java转C#】第七章:运算符和类型强制转换
|
4月前
|
Java 编译器 C#
【从Java转C#】第三章:对象和类型
【从Java转C#】第三章:对象和类型
|
7月前
|
C#
C#中的可空类型修饰符
什么是C#中的可空类型修饰符?如何使用呢?
71 0
|
9月前
|
C#
C#中 Int32.TryParse() ConVert.ToInt32() Int32.Parse () 的区别 将字符串类型转换为数字类型
C#中 Int32.TryParse() ConVert.ToInt32() Int32.Parse () 的区别 将字符串类型转换为数字类型
34 0