【C#基础】 C# 数据类型总结
序号 | 系列文章 |
---|---|
0 | 【C#基础】初识编程语言C# |
1 | 【C#基础】C# 程序通用结构总结 |
2 | 【C#基础】C# 程序基础语法解析 |
文章目录
- 前言
- 数据类型
- 一. 值类型(Value types)
- 二. 引用类型(Reference types)
- 三. 指针类型(Pointer types)
- 结语
前言
😄大家好,我是writer桑,前面一章已经学习了C#的基础语法,那本章就开始学习C#程序的数据类型,希望看完大家能够有所收获,感谢支持!
数据类型
C# 是一种强类型语言。 每个变量和常量都有一个类型,每个求值的表达式也是如此。每个方法声明都为每个输入参数和返回值指定名称、类型和种类(值、引用或输出)。C# 分别以值类型和引用类型作为类型的两个主要类别。值类型的变量直接包含它们的数据。引用类型的变量存储对数据(称为“对象”)的引用。
一. 值类型(Value types)
值类型的变量包含类型的实例,不同于引用类型的变量包含对类型实例的引用。默认情况下,在分配中,通过将实参传递给方法并返回方法结果来复制变量值。 对于值类型,每个变量都具有其自己的数据副本,对一个变量执行的操作不会影响另一个变量(ref 和 out 参数变量除外)。
代码理解:
using System;public struct MutablePoint
{public int X, Y;public MutablePoint(int x, int y) => (X, Y) = (x, y);public override string ToString() => $"({X}, {Y})";
}public class Program
{public static void Main(string[] args){var p1 = new MutablePoint(1, 2);var p2 = p1;Console.WriteLine($"{nameof(p1)} after {nameof(p2)} is modified:{p1} ");Console.WriteLine($"{nameof(p2)}: {p2}");MutateAndDisplay(p2);Console.WriteLine($"{nameof(p2)} after passing to a method: {p2}");}private static void MutateAndDisplay(MutablePoint p){p.X = 100;Console.WriteLine($"Point mutated in a method: {p}");}
}/*
* 预期的输出:
* p1 after p2 is modified:(1, 2)
* p2: (1, 2)
* Point mutated in a method: (100, 2)
* p2 after passing to a method: (1, 2)
*/
- 从运行结果可知 MutateAndDisplay 方法对传入的参数 p 的修改并不会影响 Main 方法中的 p2 参数。
- MutateAndDisplay 方法对值类型变量 p 的操作只影响当前代码所处的栈内存的变量,而 Main 方法的 p2 变量和 p 变量又是两个不同的变量。
- 结论:对值类型变量的操作只影响存储在变量中的值类型实例。
下表列出了 C# 11 中值类型的简单类型:
类型/关键字 | 描述 | 范围 | 默认值 | .NET类型 |
---|---|---|---|---|
bool | 布尔值 | True 或 False | False | System.Boolean |
char | 16位 Unicode 字符 | U+0000 到 U+FFFF | ‘\0’ | System.Char |
float | 32 位单精度浮点型 | ±1.5 x 10-45 至 ±3.4 x 1038 | 0.0F | System.Single |
double | 64 位双精度浮点型 | ±5.0 × 10 -324 至±1.7 × 10308 | 0.0D | System.Double |
decimal | 128 位精确的十进制值,28-29 有效位数 | ±1.0 x 10-28 至7.9228 x 10^28 | 0.0M | System.Decimal |
sbyte | 8 位有符号整数类型 | -128 到 127 | 0 | System.SByte |
byte | 无符号的 8 位整数 | 0 到 255 | 0 | System.Byte |
short | 有符号 16 位整数 | -32,768 到 32,767 | 0 | System.Int16 |
ushort | 无符号 16 位整数 | 0 到 65,535 | 0 | System.UInt16 |
int | 带符号的 32 位整数 | -2,147,483,648 到 2,147,483,647 | 0 | System.Int32 |
uint | 带符号的 32 位整数 | 0 到 4,294,967,295 | 0 | System.UInt32 |
long | 64 位带符号整数 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L | System.Int64 |
ulong | 无符号 64 位整数 | 0 到 18,446,744,073,709,551,615 | 0 | System.UInt64 |
nint | 带符号的 32 位或 64位整数 | 取决于(在运行时计算的)平台 | 0 | System.IntPtr |
nuint | 带符号的 32 位或 64 位整数 | 取决于(在运行时计算的)平台 | 0 | System.UIntPtr |
除了上述值类型的简单类型之外,C# 程序还包括以下用关键字声明的值类型种类:
- 枚举类型(Enumeration)
枚举类型是由基础整型数值类型的一组命名常量定义的值类型。 C# 程序中使用 enum 关键字定义枚举类型并指定枚举成员的名称,示例代码如下:
enum Season
{Spring,Summer,Autumn,Winter
}
- 结构类型(Structure)
结构类型是是一种可封装数据和相关功能的值类型,C# 程序中使用 struct 关键字定义结构类型,示例代码如下:
public struct MutablePoint
{public int X, Y;public MutablePoint(int x, int y) => (X, Y) = (x, y);public override string ToString() => $"({X}, {Y})";
}
- 元组类型(Tuple)
元组功能提供了简洁的语法来将多个数据元素分组成一个轻型数据结构。 下面的示例演示了如何声明元组变量、对它进行初始化并访问其数据成员:
(double, int) t1 = (4.5, 3);
Console.WriteLine($"Tuple with elements {t1.Item1} and {t1.Item2}.");
// Output:
// Tuple with elements 4.5 and 3.(double Sum, int Count) t2 = (4.5, 3);
Console.WriteLine($"Sum of {t2.Count} elements is {t2.Sum}.");
// Output:
// Sum of 3 elements is 4.5.
- 可为空的值类型(Null)
可为 null 值类型 T?(T 表示泛型)表示其基础值类型T 的所有值及额外的 null 值,示例代码如下:
// 值类型可隐式转换为相应的可为空的值类型
double? pi = 3.14;
char? letter = 'a';int m2 = 10;
int? m = m2;bool? flag = null;// 可空值类型的数组:
int?[] arr = new int?[10];
一些针对值类型的常用操作:
- 若要在运行时获取本机大小的整数大小,可以使用 sizeof()。 但是,必须在不安全的上下文中编译代码。示例代码:
Console.WriteLine($"size of nint = {sizeof(nint)}");
Console.WriteLine($"size of nuint = {sizeof(nuint)}");// 在64位进程中运行时输出
//size of nint = 8
//size of nuint = 8// 在32位进程中运行时输出
//size of nint = 4
//size of nuint = 4
- 若要在运行时获取本机大小的整数的最小值和最大值或者取值范围,请将 MinValue 和 MaxValue用作值类型关键字的静态属性,示例代码:
Console.WriteLine($"nint.MinValue = {nint.MinValue}");
Console.WriteLine($"nint.MaxValue = {nint.MaxValue}");//nint.MinValue = -9223372036854775808
//nint.MaxValue = 9223372036854775807
- 如果想在运行时实现值类型数据之间的相互转换,请使用隐式转换或者显式转换,示例代码:
// 隐式数据转换举例:int 转换为 long
int a = 11;
long b = a; // 显示数据转换:long 转换为 int
int a1 = 123;
long b1 = a;
int c = (int)b1;
- 如果想在运行时输出值类型的默认值,可以使用 default 运算符生成默认类型值,例如:
Console.WriteLine(default(bool)); // False
- 如果想在运行时输出值类型数据的类型,可以使用 GetType 方法,例如:
bool b = false;
Console.WriteLine(b.GetType()); // System.Boolean
二. 引用类型(Reference types)
引用类型的变量存储对其数据(对象)的引用,不同于值类型的变量直接包含其数据。 对于引用类型,多个变量可同时引用同一对象,多个变量之间互相传递的也是对这个对象的引用;因此,对一个变量执行的操作会影响另一个变量所引用的对象(这点区别于值类型)。
代码理解:
using System;// 类为引用类型
public class MutablePoint
{public int X, Y;public MutablePoint(int x, int y) => (X, Y) = (x, y);public override string ToString() => $"({X}, {Y})";
}public class Program
{public static void Main(string[] args){var p1 = new MutablePoint(1, 2);var p2 = p1;Console.WriteLine($"{nameof(p1)} after {nameof(p2)} is modified:{p1} ");Console.WriteLine($"{nameof(p2)}: {p2}");MutateAndDisplay(p2); // 显示和改变 Console.WriteLine($"{nameof(p2)} after passing to a method: {p2}");}private static void MutateAndDisplay(MutablePoint p){p.X = 100;Console.WriteLine($"Point mutated in a method: {p}");}
}/*
* 预期的输出:
* p1 after p2 is modified:(1, 2)
* p2: (1, 2)
* Point mutated in a method: (100, 2)
* p2 after passing to a method: (100, 2)
*/
- 从输出结果可知 MutateAndDisplay 方法对参数 p 修改的同时也修改了 Main 方法中的 p2 参数。
- 因为 p2 变量和 p 变量都是引用同一个对象 MutablePoint 类,也就是指向了同一块内存地址,所以 p2 变量对这内存进行修改的同时也修改了 p 变量的内存,两者同时发生变化。
- 结论:当两个变量引用同一个对象时,一个变量执行的操作会影响另一个变量的运行结果。
以下表格列举出了 C# 内置引用类型:
类型/关键字 | 描述 | .NET 类型 |
---|---|---|
object | 对象类型 | System.Object |
string | 字符串类型 | System.String |
dynamic | 动态类型 | System.Object |
除了上述内置的引用类型之外,C# 程序还包括以下用关键字声明的引用类型:
- 记录类型(Record)
从 C# 9 开始,可以使用 record 关键字定义一个 record 类型,用来提供用于封装数据的内置功能,record 类型用来构建不可变类型和和线程安全对象,简单的示例:
// 声明 record class 引用类型:
public record Person
{public string FirstName { get; init; } = default!;public string LastName { get; init; } = default!;
};// 声明 record struct 值类型:
public record struct Point
{public double X { get; init; }public double Y { get; init; }
}
- 类类型(Class)
类是将同类对象的共同属性和行为抽象出来形成的一个相对复杂的数据类型,在 C# 程序中使用 class 关键字声明类,示例如下:
class TestClass
{//方法,属性,字段,事件,委托//和嵌套类到这里。
}
- 接口类型(Interface)
接口定义"协定",继承接口的类或结构体都必须实现接口中所定义的成员,在 C# 编程中使用 interface 关键字定义接口,示例如下:
// 定义接口 ISampleInterface
interface ISampleInterface
{void SampleMethod();
}// 类 Program 继承接口并实现
public class Program : ISampleInterface
{public void SampleMethod(){throw new NotImplementedException();}
}
- 可为空的引用类型(Null)
引用类型 T? 的变量也可以用 null 进行初始化,注意在取消引用之前必须检查变量是否为空, 示例如下:
string notNull = "Hello";
string? nullable = default;
notNull = nullable!; // 给定为空值
一些针对引用类型的常用操作:
- 当一个值类型转换为对象类型时,则被称为装箱;相对的,当一个对象类型转换为值类型时,则被称为拆箱,示例代码:
//将整型变量i进行了装箱并分配给对象o。
int i = 123;
object o = i;// 将对象o拆箱并分配给对象i;
i = (int)o;Console.WriteLine(i); // 123
- string 字符串类型常见的相等运算、连接操作、输出指定位置的字符,示例代码:
string s1 = "hello, world";
string s2 = "hello, C#";// 定义相等运算符 == 和 != 比较 string 对象之间是否相等:
Console.WriteLine(s1 == s2); // False // 定义 + 连接运算符连接两个字符串:
Console.WriteLine(s1 + s2); // hello, worldhello, C# // 定义 [] 运算符可访问字符串指定位置的字符:
Console.WriteLine(s1[0]); // h
- dynamic 类型的变量表示不在编译期间进行类型检查, 而是在运行期间再进行解析,示例如下:
dynamic d = 20; // 运行时进行类型检查
三. 指针类型(Pointer types)
C# 程序中在不安全的上下文中,类型除了是值类型或引用类型外,还可以是指针类型 , 通过指针类型可以直接操作对象的内存,指针类型声明采用下列形式之一:
//type* identifier;
void* identifier; // 允许但不建议 // 又例如:
char* cptr;
int* iptr;
- 指针类型不能从对象继承,并且指针类型之间不存在类型转换
- 指针类型不支持类型装箱和拆箱的操作
- 指针不能指向引用或包含引用的结构,因为无法对对象引用进行垃圾回收
- MyType* 类型的指针变量的值为 MyType 类型的变量的地址
(ps:指针类型不在本章进行详细的讨论。)
结语
✔️ 以上就是 C# 数据类型的介绍,希望能够对大家有所帮助。望大家多多支持,你们的支持就是笔者创作最大的动力!
相关文章:
【C#基础】 C# 数据类型总结
序号系列文章0【C#基础】初识编程语言C#1【C#基础】C# 程序通用结构总结2【C#基础】C# 程序基础语法解析文章目录前言数据类型一. 值类型(Value types)二. 引用类型(Reference types)三. 指针类型(Pointer types&#…...

格子玻尔兹曼法介绍
1 LBM简介格子玻尔兹曼法(Lattice Boltzmann Method)简称LBM,是一种CFD算法,可求解流动、传热等常见CFD问题。LBM基于格子玻尔兹曼方程(LBE),从介观尺度(mesoscope)描述了…...

活动星投票在时间的河流上造园分组怎么设置如何进行分组报名
“在时间的河流上造园”网络评选投票_免费小程序运行系统_企业有关的投票_微信投票的应用小程序投票活动如何做?很多企业在运营当中,都会通过投票活动来进行推广,从而达到吸粉、增加用户粘度等效果。而此类投票活动,通过小程序就可…...

c#小笔记本-基础
c#基本知识一.基础操作1.打印-writeline,write2.输入-readline,readkey二.变量1.折叠代码-#region,#endregion2.变量类型(在c语言变量类型上新增的)三.常量-const四.转义字符五.显示转换1.括号强转-低精度装高精度2.parse法-作用于字符串3.co…...

DamiCMS SQL注入分析
2023年将会持续于B站、CSDN等各大平台更新,可加入粉丝群与博主交流:838681355,为了老板大G共同努力。 一、入口文件(单入口文件模式) 看一下Index.php文件代码:引入了php_safe.php文件 查看一下php_safe.php防御文件: 对变量e…...
图傅里叶变换的推导和理解
把传统的傅里叶变换以及卷积迁移到Graph上来,核心工作其实就是把拉普拉斯算子的特征函数 e − i ω t e^{-i\omega t} e−iω...

Java八股文(Java面试题)
JDK、JRE、JVM 三者之间的关系?JDK(Java Development Kit):是Java开发工具包,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。它能够创建和编译程序。JRE(Java Runtime Envi…...

java ssm idea高校图书借阅管理系统设计2z87z
本论文是以构建高校图书管理系统设计为目标,使用 jsp制作,由前台用户图书借阅、后台管理员图书分类两大部分组成。着重论述了系统设计分析,系统的实现(用户注册模块,用户登录,用户图书借阅模块,…...

电脑重装系统注册表恢复方法
今天讲关于大家的电脑在遇到一些故障的时候,以及电脑用久了之后会卡顿,那么这时候大家一般都会给电脑重装系统。重装系统之后却发现自己电脑里的注册表不见了,重装系统后怎么恢复注册表?小编就带着大家一起学习重装系统注册表恢复到底是怎…...
信道建模(大尺度、小尺度、莱斯衰落、瑞利衰落、莱斯信道、瑞利信道)
一、大尺度衰落与小尺度衰落 大尺度衰落由收发两端的距离决定,功率上建模为: 小尺度衰落由收发两端的环境决定,比如是否有遮挡,场景有室内、室外、平原、山村、城镇等,这些环境影响到收发两端是否有直达链路࿰…...
2022年12月电子学会Python等级考试试卷(四级)答案解析
青少年软件编程(Python)等级考试试卷(四级) 一、单选题(共25题,共50分) 1. 有n个按名称排序的商品,使用对分查找法搜索任何一商品, 最多查找次数为5次,则n的值可能为?&…...

通过实例告诉你lua中ipairs到底是怎么遍历的!
这个的文章挺多的,但是有好几种说法并且不全。有人说是忽略手动设定值,有人说是从1开始数,直到序号断开,还有人给出结果,但是和我实机测试的效果不一样, 所以我自己总结一篇。经过我的测试和总结得到以下结…...

Axios异步请求 json格式
Axios是Ajax的一个框架,简化Ajax操作。需要axios.min.js 和vue.js的jar。发送普通参数异步请求以及相应异常情况客户端向服务器端异步发送普通参数值:- 基本格式: axios().then().catch()- 示例:axios({ // axios表示要发送一个异步请求metho…...
Postgresql源码(100)Portal与事务的关系(顶层事务与子事务)
1 总结 portal与事务有强绑定的关系,由portal->createSubid变量记录关联关系。如果为1表示顶层事务,关联的是子事务。 不论是顶层事务还是子事务,提交、回滚时只会处理自己创建出来的portal。 顶层事务会清理非活跃状态的Portalÿ…...

Java、JSP企业快信系统的设计与实现
技术:Java、JSP等摘要:计算机网络的出现到现在已经经历了翻天覆地的重大改变。因特网也从最早的供科学家交流心得的简单的文本浏览器发展成为了商务和信息的中心。到了今天,互联网已经成为了大量应用的首选平台,人们已经渐渐习惯了…...

1.2(完结)C语言进阶易忘点速记
1.大端存储:高权位数字放在低地址处,低权位数字放在高地指处。(以字节为单位) 2.小端存储:低权位数字放在低地址处,高权位数字放在高地址处。(以字节为单位) 3.变量(char类型)进行运算的时候一定要注意整形提升与截断࿰…...

雅思经验(十一)
写作:WRITINGTASK 2Governments should spend money on railways rather than roads.To what extent do you agree or disagree with this statement?Give reasons for your answer and include any relevant examples from your own knowledge or experience.思路…...

C++中的智能指针
1.RAII 与引用计数了解 Objective-C/Swift 的程序员应该知道引用计数的概念。引用计数这种计数是为了防止内存泄露而产生的。 基本想法是对于动态分配的对象,进行引用计数,每当增加一次对同一个对象的引用,那么引用对象的引用计数就会增加一次…...

LSTM已死,Transformer当立(LSTM is dead. Long Live Transformers! ):下
2017 年,Google 在论文 Attention is All you need 中提出了 Transformer 模型,其使用 Self-Attention 结构取代了在 NLP 任务中常用的 RNN 网络结构。而且实验也证明Transformer 在效果上已经完败传统的 RNN 网络。Transformer 的整体模型架构如下图所示。尽管它看起来还是很…...
OJ万题详解––[NOIP2004 提高组] 合并果子(C++详解)
目录 题目 分析 参考代码 题目 题目描述 一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...