网站首页 > 技术文章 正文
在编程的世界里,数据类型是构建程序的基石。它们定义了数据的存储方式和操作方式。
C# 是一种强类型语言。每个变量和常量都有一个类型,每个求值的表达式也是如此。每个方法声明都为每个输入参数和返回值指定名称、类型和种类(值、引用或输出)。
在C#中,数据类型被分为三大类:值类型、引用类型和指针类型。
一. 值类型(Value types)
C# 中的值类型是从 System.ValueType 类中派生出来的,对于值类型的变量我们可以直接为其分配一个具体的值。
当声明一个值类型的变量时,系统会自动分配一块儿内存区域用来存储这个变量的值,需要注意的是,变量所占内存的大小会根据系统的不同而有所变化。
值类型直接包含数据。比如 int、char、float,它们分别存储数字、字符、浮点数。当声明一个 int 类型时,系统分配内存来存储值,通常这个值会直接存储与栈中,而不是堆中。
常见的值类型如下图:
除了上述值类型的简单类型之外,C# 程序还包括以下用关键字声明的值类型种类:
1.枚举类型(Enumeration)
枚举类型是由基础整型数值类型的一组命名常量定义的值类型。C# 程序中使用 enum 关键字定义枚举类型并指定枚举成员的名称。
2.结构类型(Structure)
结构类型是是一种可封装数据和相关功能的值类型,C# 程序中使用 struct 关键字定义结构类型。
3.元组类型(Tuple)
元组功能提供了简洁的语法来将多个数据元素分组成一个轻型数据结构。
4.可为空的值类型(Null)
可为 null 值类型 T?(T 表示泛型)表示其基础值类型T 的所有值及额外的 null 值。
二. 引用类型(Reference types)
引用类型的变量中并不存储实际的数据值,而是存储的对数据(对象)的引用,换句话说就是,引用类型的变量中存储的是数据在内存中的位置。
当多个变量都引用同一个内存地址时,如果其中一个变量改变了内存中数据的值,那么所有引用这个内存地址的变量的值都会改变。
C# 中内置的引用类型包括 Object(对象)、Dynamic(动态)和 string(字符串)。
1.对象类型(Object)
对象类型是 C# 通用类型系统(Common Type System:CTS)中所有数据类型的最终基类,Object 是 System.Object 类的别名。任何类型的值都可以分配给对象类型,但是在分配值之前,需要对类型进行转换。
将值类型转换为对象类型的过程被称为“装箱”,反之将对象类型转换为值类型的过程则被称为“拆箱”。只有经过装箱的数据才能进行拆箱。
2.动态类型(Dynamic)
可以在动态类型的变量中存储任何类型的值,这些变量的类型检查是在程序运行时进行的。
动态类型与对象类型类似,但对象类型变量的类型检查是在编译时进行的,而动态类型变量的类型检查则是在程序运行时进行的。
3.字符串类型(String)
字符串类型的变量允许您将一个字符串赋值给这个变量,字符串类型需要通过 String 类来创建,String 类是 System.String 类的别名,它是从对象(Object)类型中派生的。在 C# 中有两种定义字符串类型的方式,分别是使用" "和@" "。
三. 指针类型(Pointer types)
在C#中,指针类型是一种特殊的数据类型,它允许程序直接操作内存地址。使用指针,你可以访问和修改存储在特定内存地址的数据。
指针通常与非托管代码(unmanaged code)一起使用,它们在处理底层系统资源、内存管理或者与C/C++代码交互时非常有用。
指针是变量的内存地址,涉及到指针的代码必须写到unsafe代码块(或方法)中。指针的定义用*:
了解C#中的数据类型对于编写高效、可靠的程序至关重要。无论是选择正确的数据类型来存储数据,还是理解不同数据类型之间的差异,都是每个C#开发者必须掌握的技能。
猜你喜欢
- 2024-11-12 C#-练习题 014(c#程序题及答案)
- 2024-11-12 C# 类型转换(c类型转换有哪三种形式)
- 2024-11-12 C#-无参数有返回值的方法 060(有参无返回值 c语言)
- 2024-11-12 C#中的值类型和引用类型(c# 引用类型)
- 2024-11-12 abelkhan中的rpc框架(rpc框架应用场景)
- 2024-11-12 C#编程零基础到入门学习-C# 值类型和引用类型(4-8)
- 2024-11-12 2.6 C#的常用关键字和预定义类型(c#预留关键字)
- 2024-11-12 C#_图片拖拽(c#窗体图片移动)
- 2024-11-12 数据类型 - C#入门教程(c#常见数据类型)
- 2024-11-12 C#中堆栈(Stack)和堆(Heap)的区别——第一部分
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 505℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 484℃MySQL service启动脚本浅析(r12笔记第59天)
- 465℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 462℃启用MySQL查询缓存(mysql8.0查询缓存)
- 442℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 422℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 418℃MySQL server PID file could not be found!失败
- 最近发表
-
- netty系列之:搭建HTTP上传文件服务器
- 让deepseek教我将deepseek接入word
- 前端大文件分片上传断点续传(前端大文件分片上传断点续传怎么操作)
- POST 为什么会发送两次请求?(post+为什么会发送两次请求?怎么回答)
- Jmeter之HTTP请求与响应(jmeter运行http请求没反应)
- WAF-Bypass之SQL注入绕过思路总结
- 用户疯狂点击上传按钮,如何确保只有一个上传任务在执行?
- 二 计算机网络 前端学习 物理层 链路层 网络层 传输层 应用层 HTTP
- HTTP请求的完全过程(http请求的基本过程)
- dart系列之:浏览器中的舞者,用dart发送HTTP请求
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)