当前位置: 首页 > news >正文

帮忙做ppt的网站/手机百度收录提交入口

帮忙做ppt的网站,手机百度收录提交入口,贵阳住房和城乡建设部网站,公司网站建设申请书序号系列文章0【C#基础】初识编程语言C#1【C#基础】C# 程序通用结构总结2【C#基础】C# 程序基础语法解析文章目录前言数据类型一. 值类型(Value types)二. 引用类型(Reference types)三. 指针类型(Pointer types&#…
序号系列文章
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 或 FalseFalseSystem.Boolean
char16位 Unicode 字符U+0000 到 U+FFFF‘\0’System.Char
float32 位单精度浮点型±1.5 x 10-45 至 ±3.4 x 10380.0FSystem.Single
double64 位双精度浮点型±5.0 × 10 -324 至±1.7 × 103080.0DSystem.Double
decimal128 位精确的十进制值,28-29 有效位数±1.0 x 10-28 至7.9228 x 10^280.0MSystem.Decimal
sbyte8 位有符号整数类型-128 到 1270System.SByte
byte无符号的 8 位整数0 到 2550System.Byte
short有符号 16 位整数-32,768 到 32,7670System.Int16
ushort无符号 16 位整数0 到 65,5350System.UInt16
int带符号的 32 位整数-2,147,483,648 到 2,147,483,6470System.Int32
uint带符号的 32 位整数0 到 4,294,967,2950System.UInt32
long64 位带符号整数-9,223,372,036,854,775,808 到 9,223,372,036,854,775,8070LSystem.Int64
ulong无符号 64 位整数0 到 18,446,744,073,709,551,6150System.UInt64
nint带符号的 32 位或 64位整数取决于(在运行时计算的)平台0System.IntPtr
nuint带符号的 32 位或 64 位整数取决于(在运行时计算的)平台0System.UIntPtr

除了上述值类型的简单类型之外,C# 程序还包括以下用关键字声明的值类型种类:

  1. 枚举类型(Enumeration)
    枚举类型是由基础整型数值类型的一组命名常量定义的值类型。 C# 程序中使用 enum 关键字定义枚举类型并指定枚举成员的名称,示例代码如下:
enum Season
{Spring,Summer,Autumn,Winter
}
  1. 结构类型(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})";
}
  1. 元组类型(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. 
  1. 可为空的值类型(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# 程序还包括以下用关键字声明的引用类型:

  1. 记录类型(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;  }
}
  1. 类类型(Class)
    类是将同类对象的共同属性和行为抽象出来形成的一个相对复杂的数据类型,在 C# 程序中使用 class 关键字声明类,示例如下:
class TestClass
{//方法,属性,字段,事件,委托//和嵌套类到这里。
}
  1. 接口类型(Interface)
    接口定义"协定",继承接口的类或结构体都必须实现接口中所定义的成员,在 C# 编程中使用 interface 关键字定义接口,示例如下:
// 定义接口 ISampleInterface 
interface ISampleInterface
{void SampleMethod();
}// 类 Program 继承接口并实现
public class Program : ISampleInterface
{public void SampleMethod(){throw new NotImplementedException();}
}
  1. 可为空的引用类型(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制作,由前台用户图书借阅、后台管理员图书分类两大部分组成。着重论述了系统设计分析,系统的实现(用户注册模块,用户登录,用户图书借阅模块,…...

电脑重装系统注册表恢复方法

​今天讲关于大家的电脑在遇到一些故障的时候,以及电脑用久了之后会卡顿,那么这时候大家一般都会给电脑重装系统。重装系统之后却发现自己电脑里的注册表不见了,重装系统后怎么恢复注册表?小编就带着大家一起学习重装系统注册表恢复到底是怎…...

信道建模(大尺度、小尺度、莱斯衰落、瑞利衰落、莱斯信道、瑞利信道)

一、大尺度衰落与小尺度衰落 大尺度衰落由收发两端的距离决定,功率上建模为: 小尺度衰落由收发两端的环境决定,比如是否有遮挡,场景有室内、室外、平原、山村、城镇等,这些环境影响到收发两端是否有直达链路&#xff0…...

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&#xff…...

Java、JSP企业快信系统的设计与实现

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

1.2(完结)C语言进阶易忘点速记

1.大端存储:高权位数字放在低地址处,低权位数字放在高地指处。(以字节为单位) 2.小端存储:低权位数字放在低地址处,高权位数字放在高地址处。(以字节为单位) 3.变量(char类型)进行运算的时候一定要注意整形提升与截断&#xff0…...

雅思经验(十一)

写作: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++详解)

目录 题目 分析 参考代码 题目 题目描述 一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的…...

MySQL-字符集和比较规则

在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系 了,建立这个关系最起码要搞清楚两件事: 界定清楚字符范围:需要把哪些字符映射成二进制数据?编码与解码&#x…...

微搭低代码从入门到精通12-网格布局

开发小程序首要的就是考虑布局的问题,我们在以前的版本只能选择普通容器结合图片和文本组件来构建页面。 使用通用组件布局也可以,但有个问题是你要先学习CSS,要懂布局的概念,比如需要知道啥是flex布局,然后还得熟悉每…...

【c语言】二叉树

主页:114514的代码大冒险 qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ ) Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 引入 我们之前已经学过线性数据结构,今天我们将介绍非线性数据结构----树 树是一种非线性的…...

六、Java框架之SpringBoot

黑马课程 文章目录1. SpringBoot入门1.1 SpringBoot入门案例步骤1:创建SpringBoot项目高版本springboot常见错误步骤2:创建BookController步骤3:启动服务器并运行程序pom.xml示例1.2 官网创建SpringBoot1.3 SpringBoot工程快速启动问题导入打…...

「Python|环境安装|Windows」如何在Windows上安装Python环境?

本文主要介绍如何在Windows上安装Python,帮助初学者或者非程序员伙伴快速搭建可以运行python代码的环境。 文章目录安装python做一点小配置验证python如何安装指定版本的python编程语言的环境搭建一直是学习编程的第一道门槛。 对于如何在Linux系统上安装指定版本的…...

人工智能轨道交通行业周刊-第33期(2023.2.6-2.12)

本期关键词:高铁激光清洗、高铁确认列车、无线通信系统、推理服务优化、量子信息技术 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟V…...

五分钟看懂Java字节码:极简手册

字节码新手很容易被厚厚的 JVM 书籍劝退,即使我看过相关书籍,工作真正用到时也全忘了,还得现学。 等我有了一定的字节码阅读经验,才发现字节码其实非常简单,只需要三步就能快速学会: 先了解 JVM 的基本结…...

C++ 类与对象(下)

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;C类与对象的收尾工作&#…...

Java基础——I/O

一、异常 异常是程序中可能出现的问题&#xff0c;它的父类是Exception。异常分为两类&#xff0c;编译时异常、运行时异常。 编译时异常&#xff1a;没有继承RuntimeException的异常&#xff0c;直接继承于Exception。编译阶段就会错误提示。运行时异常&#xff1a;RuntimeE…...

关于@hide的理解

在上一篇文章《学习HandlerThread》我们提到虽然HandlerThread类里有getThreadHandler()方法得到Handler&#xff0c;但是我们不可能调用到它。因为这个方法用hide注释了 /*** return a shared {link Handler} associated with this thread* hide*/NonNullpublic Handler getT…...