C#指南,重温基础,展望远方!(3)类型和变量
C# 有两种类型:值类型和引用类型。 值类型的变量直接包含数据,而引用类型的变量则存储对数据(称为“对象”)的引用。对于引用类型,两个变量可以引用同一对象;因此,对一个变量执行的运算可能会影响另一个变量引用的对象。 对于值类型,每个变量都有自己的数据副本;因此,对一个变量执行的运算不会影响另一个变量(ref 和 out 参数变量除外)。
C# 值类型又细分为简单类型、枚举类型、结构类型和可以为 null 的值类型。 C# 引用类型又细分为类类型、接口类型、数组类型和委托类型。
下面概述了 C# 的类型系统。
- 值类型
- 简单类型
- 有符号的整型:
sbyte、short、int、long - 无符号的整型:
byte、ushort、uint、ulong - Unicode 字符:
char - IEEE 浮点:
float、double - 高精度小数:
decimal - 布尔:
bool
- 有符号的整型:
- 枚举类型
- 格式为
enum E {...}的用户定义类型
- 格式为
- 结构类型
- 格式为
struct S {...}的用户定义类型
- 格式为
- 可以为 null 的值类型
- 值为
null的其他所有值类型的扩展
- 值为
- 简单类型
- 引用类型
- 类类型
- 其他所有类型的最终基类:
object - Unicode 字符串:
string - 格式为
class C {...}的用户定义类型
- 其他所有类型的最终基类:
- 接口类型
- 格式为
interface I {...}的用户定义类型
- 格式为
- 数组类型
- 一维和多维,例如
int[]和int[,]
- 一维和多维,例如
- 委托类型
- 格式为
delegate int D(...)的用户定义类型
- 格式为
- 类类型
八个整型类型支持带符号或不带符号格式的 8 位、16 位、32 位和 64 位值。
两个浮点类型(float 和 double)分别使用 32 位单精度和 64 位双精度 IEC-60559 格式表示。
decimal 类型是适用于财务和货币计算的 128 位数据类型。
C# 的 bool 类型用于表示布尔值(true 或 false)。
C# 使用 Unicode 编码处理字符和字符串。 char 类型表示 UTF-16 代码单元,string 类型表示一系列 UTF-16 代码单元。
下面总结了 C# 的数值类型。
- 有符号的整型
sbyte:8 位,介于 -128 到 127 之间short:16 位,介于 -32,768 到 32,767 之间int:32 位,介于 -2,147,483,648 到 2,147,483,647 之间long:64 位,介于 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 之间
- 无符号的整型
byte:8 位,介于 0 到 255 之间ushort:16 位,介于 0 到 65,535 之间uint:32 位,介于 0 到 4,294,967,295 之间ulong:64 位,介于 0 到 18,446,744,073,709,551,615 之间
- 浮点
float:32 位,介于 1.5 × 10-45 到 3.4 × 1038 之间,7 位精度double:64 位,介于 5.0 × 10-324 到 1.7 × 10308 之间,15 位精度
- Decimal
decimal:128 位,至少介于 -7.9 × 10-28 到 7.9 × 1028 之间,至少为 28 位精度
C# 程序使用类型声明创建新类型。 类型声明指定新类型的名称和成员。 用户可定义以下五种 C# 类型:类类型、结构类型、接口类型、枚举类型和委托类型。
class 类型定义包含数据成员(字段)和函数成员(方法、属性及其他)的数据结构。 类类型支持单一继承和多形性,即派生类可以扩展和专门针对基类的机制。
struct 类型定义包含数据成员和函数成员的结构,这一点与类类型相似。 不过,与类不同的是,结构是值类型,通常不需要进行堆分配。 结构类型不支持用户指定的继承,并且所有结构类型均隐式继承自类型 object。
interface 类型将协定定义为一组已命名的公共函数成员。 实现 interface 的 class 或 struct 必须提供接口函数成员的实现代码。 interface 可以继承自多个基接口,class 和 struct 可以实现多个接口。
delegate 类型表示引用包含特定参数列表和返回类型的方法。 通过委托,可以将方法视为可分配给变量并可作为参数传递的实体。 委托类同于函数式语言提供的函数类型。 委托也类似于其他一些语言中的函数指针概念,但与函数指针不同的是,委托不仅面向对象,还类型安全。
class、struct、interface 和 delegate 类型全部都支持泛型,因此可以使用其他类型对它们进行参数化。
enum 类型是一种包含已命名常量的独特类型。 每个 enum 类型都有一个基础类型(必须是八种整型类型之一)。 enum 类型的值集与基础类型的值集相同。
C# 支持任意类型的一维和多维数组。 与上述类型不同,数组类型无需先声明即可使用。 相反,数组类型是通过在类型名称后面添加方括号构造而成。 例如,int[] 是 int 类型的一维数组,int[,] 是 int 类型的二维数组,int[][] 是由 int 类型的一维数组构成的一维数组。
可以为 null 的值类型也无需先声明即可使用。 对于所有不可以为 null 的值类型 T,都有对应的可以为 null 的值类型 T?,后者可以包含附加值 null。 例如,int? 是可以包含任何 32 位整数或值 null 的类型。
C# 采用统一的类型系统,因此任意类型的值都可视为 object。 每种 C# 类型都直接或间接地派生自 object 类类型,而 object 是所有类型的最终基类。 只需将值视为类型 object,即可将引用类型的值视为对象。 通过执行装箱和取消装箱操作,可以将值类型的值视为对象。 在以下示例中,int 值被转换成 object,然后又恢复成 int。
using System;
class BoxingExample
{
static void Main()
{
int i = 123;
object o = i; // Boxing
int j = (int)o; // Unboxing
}
}
当值类型的值转换成 object 类型时,将分配 object 实例(亦称为“箱”)来包含值,然后该值会复制到相应的箱中。 相反,当 object 引用被显式转换成值类型时,将检查引用的 object 是否是具有正确值类型的箱;如果检查成功,则会将箱中的值复制出来。
C# 的统一类型系统实际上意味着可以“按需”将值类型转换成对象。 鉴于这种统一性,使用类型 object 的常规用途库可以与引用类型和值类型结合使用。
C# 有多种变量,其中包括字段、数组元素、局部变量和参数。 变量表示存储位置,每个变量都具有一种类型,用于确定可以在变量中存储哪些值,如下文所述。
- 不可以为 null 的值类型
- 具有精确类型的值
- 可以为 null 的值类型
null值或具有精确类型的值
- object
null引用、对任意引用类型的对象的引用,或对任意值类型的装箱值的引用
- 类类型
null引用、对类类型实例的引用,或对派生自类类型的类实例的引用
- 接口类型
null引用、对实现接口类型的类类型实例的引用,或对实现接口类型的值类型的装箱值的引用
- 数组类型
null引用、对数组类型实例的引用,或对兼容的数组类型实例的引用
- 委托类型
null引用或对兼容的委托类型实例的引用
C#指南,重温基础,展望远方!(3)类型和变量的更多相关文章
- python基础知识4--数据类型与变量
阅读目录 一.变量 二.数据类型 2.1 什么是数据类型及数据类型分类 2.2 标准数据类型: 2.2.1 数字 2.2.1.1 整型: 2.2.1.2 长整型long: 2.2.1.3 布尔bool ...
- python基础复习-1-1文件类型、变量、运算符、表达式
文件类型: .py python源文件 由python解释器执行 .pyc python源码编译后生成的文件(字节代码) 编译方法: 源码文件中使用py_compile模块 import py_com ...
- C#指南,重温基础,展望远方!(10)C#枚举
枚举类型是包含一组已命名常量的独特值类型. 需要定义包含一组离散值的类型时,可以定义枚举. 枚举使用一种整型值类型作为其基础存储, 并提供离散值的语义含义. 以下示例声明并使用名为“Color”的 e ...
- C#指南,重温基础,展望远方!(6)C#类和对象
类是最基本的 C# 类型. 类是一种数据结构,可在一个单元中就将状态(字段)和操作(方法和其他函数成员)结合起来. 类为动态创建的类实例(亦称为“对象”)提供了定义. 类支持继承和多形性,即派生类可以 ...
- C#指南,重温基础,展望远方!(1)C#语言介绍
1.C#(读作“See Sharp”)是一种简单易用的新式编程语言,不仅面向对象,还类型安全. C# 源于 C 语言系列,C.C++.Java 和 JavaScript 程序员很快就可以上手使用. 2 ...
- C#指南,重温基础,展望远方!(7)C#结构
结构是可以包含数据成员和函数成员的数据结构,这一点与类一样:与类不同的是,结构是值类型,无需进行堆分配. 结构类型的变量直接存储结构数据,而类类型的变量存储对动态分配的对象的引用. 结构类型不支持用户 ...
- Redis 小白指南(二)- 基础命令和五大类型:字符串、散列、列表、集合和有序集合
Redis 小白指南(二)- 基础命令和五大类型:字符串.散列.列表.集合和有序集合 引言 目录 基础命令 字符串类型 散列类型 列表类型 集合类型 有序集合类型 基础命令 1.获得符合规则的键名列表 ...
- 【重温基础】17.WebAPI介绍
本文是 重温基础 系列文章的第十七篇. 今日感受:挑战. 系列目录: [复习资料]ES6/ES7/ES8/ES9资料整理(个人整理) [重温基础]1-14篇 [重温基础]15.JS对象介绍 [重温基础 ...
- Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合
Redis 小白指南(二)- 聊聊五大类型:字符串.散列.列表.集合和有序集合 引言 开篇<Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍>已经介绍了 Redis 的 ...
随机推荐
- 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph
题意:给你一张图,给你每个点的权值,要么是-1,要么是1,要么是0.如果是-1就不用管,否则就要删除图中的某些边,使得该点的度数 mod 2等于该点的权值.让你输出一个留边的方案. 首先如果图内有-1 ...
- 【CCpp程序设计2017】简单进销存
题目:简单进销存 功能要求: 实现如下的菜单(按数字选择菜单功能): 1. 显示存货列表 2. 入库 3. 出库 4. 退出程序 实现菜单对应功能(需记录货物的型号.数量等信息): 程序启动时从文件中 ...
- Redis简单入门认识
写在前面: 最近一直都在按照老大的学习路线来进行学习,这几天看了下redis,从刚开始的摸不着头脑,到后面慢慢的查资料,对其逐渐有了简单的了解,也通过一个与ssm框架整合的小demo去动手实践 了,知 ...
- ArcGIS 10.2 三维分析工具箱部分工具不能用
如在以下面的方式操作时发现弹出错误提示, “ Unable to execute the selected tool”... 问题解决方法为: 点击Extensions...,然后把下图中的选项全部勾 ...
- SecureCRT connecting VM Linux show error message: The remote system refused the connection.
SecureCRT connecting VM Linux show error message: The remote system refused the connection.
- 工作中常用Lixu命令学习笔记
对于Linux,我是菜鸟,也是在工作中了才开始慢慢接触,用Linux的人都我都会觉得屌屌的,现在把工作中常用的一些Linux命令记录一下,供以后学习和参考. cd 这可能是我觉得Linux最简单的一个 ...
- js中定义变量的三种方式const,val,let 的区别
js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始 ...
- QT5的程序打包发布(将QT5的工程项目打包成一个exe程序)
最近,在学习QT5的过程中,想尝试着把自己写的工程程序给打包发布出来,在任何一台windows系统都能运行,这样就不会限于电脑需不需要安装QT安装包了. 首先,先介绍自己使用的环境.我使用的QT版本是 ...
- Navicat查看MySQL日志
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...
- IT人士感悟(转)
我今年39岁了,25岁研究生毕业,工作14年,回头看看,应该说走了不少的弯路,有一些经验和教训.现在开一个小公司,赚的钱刚够养家糊口的.看看这些刚毕业的学生,对前景也很迷茫,想抛砖引玉,谈谈自己的看法 ...