C# 数据类型详解:掌握数据类型及操作为高效编码奠定基础

本文将带你深入了解C#中各种数据类型的特点、用途和最佳实践,让你不仅能熟练运用基本类型,还能掌握如何在实际项目中做出最合适的选择。

目录

C#基本语法

C#数据类型

C#类型转换

C#变量常量


C#基本语法

        在学习C#之前我们要先知道C#的基础构建是由哪些部分组成,要知道C#文件的后缀为.cs,以下创建一个test.cs文件,文件包含了可以打印出 "Hello World" 的简单代码,而C#程序主要包括以下几个部分:

using System;
namespace HelloWorldApplication # 命名空间声明(namespace declaration)
{class HelloWorld # class类(包括方法、属性){static void Main(string[] args) # mian方法{/* 我的第一个 C# 程序 注释*/Console.WriteLine("Hello World"); # 语句与表达式Console.ReadKey();}}
}

        在任何C#程序中的第一条语句都是:using System; using关键字用于在程序中包含命名空间,一个程序可以包含多个using语句。class关键字用于声明一个类,在C#中注释也和其他代码一样:/*多行注释*/、//单行注释,标识符是用来识别类、变量、函数或任何其它用户定义的项目,在C#中,类的命名必须遵循如下基本规则:

/*
标识符必须以字母、下划线或 @ 开头,后面可以跟一系列的字母、数字( 0 - 9 )、下划线( _ )、@。
标识符中的第一个字符不能是数字。
标识符必须不包含任何嵌入的空格或符号,比如 ? - +! # % ^ & * ( ) [ ] { } . ; : " ' / \。
标识符不能是 C# 关键字。除非它们有一个 @ 前缀。 例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。
标识符必须区分大小写。大写字母和小写字母被认为是不同的字母。
不能与C#的类库名称相同。
*/

        顶级语句:在C#9.0版本中,引入了顶级语句(Top-Level Statements)的概念,这是一种新的编程方式,允许开发者在文件的顶层直接编写语句而不需要将它们封装在方法和类里面,和前端些js十分类似,哪需要整一些花里胡哨的东西,直接声明变量、定义方法、处理异常,如下:

using System;
using System.Linq;// 顶级语句中的变量声明
int number = 42;
string message = "The answer to life, the universe, and everything is";// 输出变量
Console.WriteLine($"{message} {number}.");// 定义和调用方法
int Add(int a, int b) => a + b;
Console.WriteLine($"Sum of 1 and 2 is {Add(1, 2)}.");// 使用 LINQ
var numbers = new[] { 1, 2, 3, 4, 5 };
var evens = numbers.Where(n => n % 2 == 0).ToArray();
Console.WriteLine("Even numbers: " + string.Join(", ", evens));// 异常处理
try
{int zero = 0;int result = number / zero;
}
catch (DivideByZeroException ex)
{Console.WriteLine("Error: " + ex.Message);
}

顶级语句在简化代码结构、降低学习难度和加快开发速度方面具有显著优势,特别适合于编写简单程序和脚本。顶级语句的特点主要包含如下几个方面:

1)无需类或方法:顶级语句允许你直接在文件的顶层编写代码,无需定义类或方法自动

2)自动Main 方法:编译器会自动生成一个Main方法,并将顶级语句作为Main方法的主体

3)文件作为入口点:包含顶级语句的文件被视为程序的入口点,类似于C#之前的Main方法

4)支持局部函数:尽管不需要定义类,但顶级语句的文件中仍然可以定义局部函数。

5)更好的可读性:对于简单的脚本或工具,顶级语句提供了更好的可读性和简洁性。

6)适用于小型项目:顶级语句非常适合小型项目或脚本,可以快速编写和运行代码。

7)与现有代码兼容:顶级语句可以与现有的C#代码库一起使用,不会影响现有代码。

注意:顶级语句只能在一个源文件中使用,如在一个项目中有多个使用顶级语句的文件会导致编译错误;如果使用顶级语句则该文件会隐式地包含Main方法,并且该文件将成为程序的入口点;顶级语句中的代码共享一个全局作用域,这意味着可以在顶级语句中定义的变量和方法可以在整个文件中访问。

        切换C#版本:在C#版本中如果你是低版本是有时候无法使用C#的语法糖的,使用之后就会提示你当前的C#版本过低,需要我们提高C#的版本,如下所示:

如果想切换版本我们就需要右击我们的我们先进行卸载,如下所示:

然后再右键我们卸载的项目,点击编辑项目文件然后添加一行语言版本,这里我们设置如下10版本就可以使用我们上面的顶级语句了:

<LangVersion>10.0</LangVersion>

C#数据类型

在C#中,变量分为以下几种类型:

值类型:值类型变量可以直接分配给一个值,它是从类System.ValueType中派生的,值类型直接包含数据,比如int、char、float等,它们分别存储数字、字符、浮点数,例如声明一个int类型时系统会分配内存来存储值,以下是值类型常见的类别:

关键字说明字节大小
bool逻辑值(真/假)1
sbyte有符号8位整数1
byte无符号8位整数1
short有符号16位整数2
ushort无符号16位整数2
int有符号32位整数4
uint无符号32位整数4

引用类型:引用类型不包含存储在变量中的实际数据而包含对变量的引用,使用多个变量时引用类型可以指向一个内存位置,如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化,如下所示:

/*对象类型(object):可以被分配任何其他类型,在分配值之前需要先进行类型转换。值类型转换为对象类型时,被称为“装箱”;对象类型转换为值类型时,则被称为“拆箱”。
*/
using System;object obj;
obj = 100; // 这是装箱/*字符串类型(String):允许给变量分配任何字符串值字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号字符串前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待
*/
String str1 = "runoob.com";
string str2 = @"C:\Windows"; // 等价于 string str = "C:\\Windows";

指针类型:指针类型变量存储另一种类型的内存地址,C#中的指针与C或C++中的指针有相同的功能,如下所示:

//声明指针类型的语法:
type* identifier;// 实例:
char* cptr;
int* iptr;

C#类型转换

类型转换是将一个数据类型的值转换为另一个数据类型的过程,在C#中的类型转换可以分为两种:隐式类型转换和显式类型转换(也称强类型转换),如下所示:

隐式类型转换:将一个较小范围的数据类型转换为较大范围的数据类型时,不需要编写代码来指定的转换,编译器会自动进行,如下所示:

byte b = 10;
int i = b; // 隐式转换,不需要显式转换// 将一个整数赋值给一个长整数,或者将一个浮点数赋值给一个双精度浮点数,这种转换不会导致数据丢失
int intValue = 42;
long longValue = intValue; // 隐式转换,从 int 到 long

显式类型转换:将一个较大范围的数据类型转换为较小范围的数据类型时,或者将一个对象类型转换为另一个对象类型时,需要使用强制类型转换符号进行显示转换,强制转换会造成数据丢失,如下所示:

//强制转换为整数类型:
double doubleValue = 3.14;
int intValue1 = (int)doubleValue; // 强制从 double 到 int,数据可能损失小数部分//强制转换为浮点数类型:
int intValue2 = 42;
float floatValue = (float)intValue2; // 强制从 int 到 float,数据可能损失精度

C#提供了以下内置的转换类型的方法,如下所示:

ToBoolean() // 把类型转换为布尔型
ToByte() // 把类型转换为字节型
ToChar() // 把类型转换为字符型
ToDateTime() // 把类型转换为日期时间型
ToDecimal() // 把类型转换为十进制型
ToDouble() // 把类型转换为双精度浮点型。
ToSbyte() // 把类型转换为有符号字节型
ToSingle() // 把类型转换为单精度浮点型
ToString() // 把类型转换为字符串型
ToType() // 把类型转换为指定类型

当然C#还提供了多种类型转换方法,例如使用Convert类、Parse方法和TryParse方法,这些方法可以帮助处理不同的数据类型之间的转换,如下所示:

//使用 Convert 类,可以在各种基本数据类型之间进行转换。
string str1 = "123";
int num = Convert.ToInt32(str1);//使用 Parse 方法,用于将字符串转换为对应的数值类型,如果转换失败会抛出异常。
string str2 = "123.45";
double d1 = double.Parse(str2);//使用 TryParse 方法,类似于 Parse,但它不会抛出异常,而是返回一个布尔值指示转换是否成功。
string str3 = "123.45";
double d2;
bool success = double.TryParse(str3, out d2);if (success)
{Console.WriteLine("转换成功: " + d2);
}
else
{Console.WriteLine("转换失败");
}

总结:在进行类型转换时需要注意以下几点:

1)隐式转换只能将较小范围的数据类型转换为较大范围的数据类型,不能将较大范围的数据类型转换为较小范围的数据类型

2)显式转换可能会导致数据丢失或精度降低,需要进行数据类型的兼容性检查

3)对于对象类型的转换,需要进行类型转换的兼容性检查和类型转换的安全性检查

C#变量常量

        变量:在C#中变量是用于存储和表示数据的标识符,在声明变量时需要指定类型并可以有选择性的为其分配一个初始值。每个变量都有一个特定的类型,类型决定了变量内存大小和布局,范围内的值可以存储在内存中对变量进行一系列操作,C#中提供的基本的值类型大致可以分为以下几类:

类型举例
整数类型sbyte、byte、short、ushort、int、uint、long、ulong 和 char
浮点型float, double
十进制类型decimal
布尔类型true 或 false 值,指定的值
空字符串string
空类型可为空值的数据类型

在C#中定义变量的格式就是:数据类型+ 变量名称,一些有效的变量定义如下所示:

// 定义变量(可以定义不同类型)
int i, j, k;
char c, ch;
float f, salary;
double d;// 定义变量并初始化值
int i = 100;// 设置动态类型,允许在运行时推断变量的类型
dynamic dynamicVariable = "This can be any type";

在C#中变量的作用域定义了变量的可见性和生命周期,变量的作用域通常由花括号 {} 定义的代码块来确定,以下是关于C#变量作用域的一些基本规则:

// 01局部变量
void MyMethod()
{int localVar = 10; // 局部变量,外部不可访问// ...
}
// 02块级作用域,在 C# 7及更高版本中,引入了块级作用域,即使用大括号 {} 创建的任何块都可以定义变量的作用域。
{int blockVar = 20; // 块级作用域,外部不可访问// ...
}
// 03方法参数作用域
void MyMethod2(int parameter)
{// parameter 在整个方法中可见// ...
}
// 04全局变量,在整个类中可见,如果在命名空间级别定义,那么它们在整个命名空间中可见。
class MyClass
{int memberVar = 30; // 成员变量,在整个类中可见
}
// 05静态变量作用域,在类级别上声明的,但它们的作用域也受限于其定义的类。
class MyClass2
{static int staticVar = 40; // 静态变量,在整个类中可见
}
// 06循环变量作用域,在循环中定义的变量,其作用域仅限于循环本身。
for (int i = 0; i < 5; i++)
{// i 在循环体内可见
}

        常量:固定值(被定义后无法被修改),程序执行期间不会改变,可以是任何基本数据类型,比如整数常量、浮点常量、字符常量、字符串常量和枚举常量等,可以被当作常规的变量。常量是使用const关键字来定义的,定义一个常量的语法如下:

using System;public class ConstTest 
{class SampleClass{public int x;public int y;public const int c1 = 5;public const int c2 = c1 + 5;public SampleClass(int p1, int p2) {x = p1; y = p2;}}static void Main(){SampleClass mC = new SampleClass(11, 22);Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y);Console.WriteLine("c1 = {0}, c2 = {1}", SampleClass.c1, SampleClass.c2);}
}

字符常量是括在单引号里,在C#中有一些特定的字符,当它们的前面带有反斜杠时有特殊的意义,可用于表示换行符(\n)或制表符tab(\t),在这里列出一些转义序列码:

转义序列含义
\\\ 字符
\'' 字符
\"" 字符
\?? 字符
\aAlert 或 bell
\b退格键(Backspace)
\f换页符(Form feed)
\n换行符(Newline)
\r回车
\t水平制表符 tab
\v垂直制表符 tab
\ooo一到三位的八进制数
\xhh . . .一个或多个数字的十六进制数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/481538.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新型大语言模型的预训练与后训练范式,谷歌的Gemma 2语言模型

前言&#xff1a;大型语言模型&#xff08;LLMs&#xff09;的发展历程可以说是非常长&#xff0c;从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初&#xff0c;LLM的训练过程只关注预训练&#xff0c;但后来逐步扩展到了包括预训练和后训练在内的完整…

Istio笔记01--快速体验Istio

Istio笔记01--快速体验Istio 介绍部署与测试部署k8s安装istio测试istio 注意事项说明 介绍 Istio是当前最热门的服务网格产品&#xff0c;已经被广泛应用于各个云厂商和IT互联网公司。企业可以基于Istio轻松构建服务网格&#xff0c;在接入过程中应用代码无需更改&#xff0c;…

uniapp运行时,同步资源失败,未得到同步资源的授权,请停止运行后重新运行,并注意手机上的授权提示。

遇到自定义基座调试时安装无效或无反应&#xff1f;本文教你用 ADB 工具快速解决&#xff1a;打开 USB 调试&#xff0c;连接设备&#xff0c;找到应用包名&#xff0c;一键卸载问题包&#xff0c;清理干净后重新运行调试基座&#xff0c;轻松搞定&#xff01; 问题场景&#…

CAD 文件 批量转为PDF或批量打印

CAD 文件 批量转为PDF或批量打印&#xff0c;还是比较稳定的 1.需要本地安装CAD软件 2.通过 Everything 搜索工具搜索&#xff0c;DWG To PDF.pc3 &#xff0c;获取到文件目录 &#xff0c;替换到代码中&#xff0c; originalValue ACADPref.PrinterConfigPath \ r"C:…

蓝桥杯每日真题 - 第23天

题目&#xff1a;&#xff08;直线&#xff09; 题目描述&#xff08;12届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目理解: 在平面直角坐标系中&#xff0c;从给定的点集中确定唯一的直线。 两点确定一条直线&#xff0c;判断两条直线是否相同&#xff0c;可通过…

centos8:Could not resolve host: mirrorlist.centos.org

【1】错误消息&#xff1a; [rootcentos211 redis-7.0.15]# yum update CentOS Stream 8 - AppStream …

Android笔记(三十四):封装带省略号图标结尾的TextView

背景 项目需求需要实现在文本末尾显示一个icon&#xff0c;如果文本很长时则在省略号后面显示icon&#xff0c;使用TextView自带的drawableEnd可以实现&#xff0c;但是如果文本换行了则会显示在TextView垂直居中的位置&#xff0c;不满足要求&#xff0c;于是有了本篇的自定义…

CEF127 编译指南 Linux篇 - 安装Git和Python(三)

1. 引言 在前面的文章中&#xff0c;我们已经完成了基础开发工具的安装和配置。接下来&#xff0c;我们需要安装两个同样重要的工具&#xff1a;Git 和 Python。这两个工具在 CEF 的编译过程中扮演着关键角色。Git 负责管理和获取源代码&#xff0c;而 Python 则用于运行各种编…

centos系统设置本地yum源教程

在CentOS系统中,将ISO文件设置为本地源可以加快软件安装速度,特别是在没有网络连接的环境下。以下是详细步骤: 1. 下载和准备ISO镜像文件 首先,从CentOS的官方网站下载适合需求的CentOS ISO镜像文件。可以选择不同的版本,如CentOS 7或CentOS 8,以及适合你硬件架构的版本…

PDF view | Chrome PDF Viewer |Chromium PDF Viewer等指纹修改

1、打开https://www.browserscan.net/zh/ 2、将internal-pdf-viewer改为 internal-pdf-viewer-jdtest看下效果&#xff1a; 3、源码修改&#xff1a; third_party\blink\renderer\modules\plugins\dom_plugin_array.cc namespace { DOMPlugin* MakeFakePlugin(String plugin_…

模糊认知图模型、特征与推理

1. 基础知识 1.1认知图的发展 1948年&#xff0c;Tolman首次提到认知图&#xff3b;I]它把认知图描述为有向图&#xff0c;认为认知图是由一些弧连接起来的结点的集合&#xff0c;其目的是为心理学构建一个模型。后来&#xff0c;认知图被其他学者所借用&#xff0c;不同的学…

Mac 环境下类Xshell 的客户端介绍

在 Mac 环境下&#xff0c;类似于 Windows 环境中 Xshell 用于访问 Linux 服务器的工具主要有以下几种&#xff1a; SecureCRT&#xff1a; 官网地址&#xff1a;https://www.vandyke.com/products/securecrt/介绍&#xff1a;支持多种协议&#xff0c;如 SSH1、SSH2、Telnet 等…

玩转 uni-app 静态资源 static 目录的条件编译

一. 前言 老生常谈&#xff0c;了解 uni-app 的开发都知道&#xff0c;uni-app 可以同时支持编译到多个平台&#xff0c;如小程序、H5、移动端 App 等。它的多端编译能力是 uni-app 的一大特点&#xff0c;让开发者可以使用同一套代码基于 Vue.js 的语法编写程序&#xff0c;然…

【西瓜书】支持向量机(SVM)

支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;。 超平面 分类学习最基本的想法就是基于训练集合D在样本空间中找到一个划分超平面&#xff0c;将不同类别的样本分开。 但能将训练样本分开的划分超平面可能有很多&#xff0c;应该努力去找到哪…

【开源免费】基于SpringBoot+Vue.JS宠物咖啡馆平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 064 &#xff0c;文末自助获取源码 \color{red}{T064&#xff0c;文末自助获取源码} T064&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

海康VsionMaster学习笔记(学习工具+思路)

一、前言 VisionMaster算法平台集成机器视觉多种算法组件&#xff0c;适用多种应用场景&#xff0c;可快速组合算法&#xff0c;实现对工件或被测物的查找测量与缺陷检测等。VM算法平台依托海康威视在图像领域多年的技术积淀&#xff0c;自带强大的视觉分析工具库&#xff0c;可…

Linux内核编译流程(Ubuntu24.04+Linux Kernel 6.8.12)

万恶的拯救者&#xff0c;使用Ubuntu没有声音&#xff0c;必须要自己修改一下Linux内核中的相关驱动逻辑才可以&#xff0c;所以被迫学习怎么修改内核&编译内核&#xff0c;记录如下 准备工作 下载Linux源码&#xff1a;在Linux发布页下载并使用gpg签名验证 即&#xff1a…

UE5 打包报错 Unknown structure 的解决方法

在虚幻引擎5.5 打包报错如下&#xff1a; UATHelper: 打包 (Windows): LogInit: Display: LogProperty: Error: FStructProperty::Serialize Loading: Property ‘StructProperty /Game/Components/HitReactionComponent/Blueprints/BI_ReactionInterface.BI_ReactionInterface…

根据导数的定义计算导函数

根据导数的定义计算导函数 1. Finding derivatives using the definition (使用定义求导)1.1. **We want to differentiate f ( x ) 1 / x f(x) 1/x f(x)1/x with respect to x x x**</font>1.2. **We want to differentiate f ( x ) x f(x) \sqrt{x} f(x)x ​ wi…

论文阅读:Dual-disentangled Deep Multiple Clustering

目录 摘要 引言 模型 实验 数据集 实验结果 结论 摘要 多重聚类近年来引起了广泛关注&#xff0c;因为它能够从不同的角度揭示数据的多种潜在结构。大多数多重聚类方法通常先通过控制特征之间的差异性来提取特征表示&#xff0c;然后使用传统的聚类方法&#xff08;如 …