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 . . .一个或多个数字的十六进制数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

后端-mybatis的多对多

首先准备两张表学生表和课程表&#xff0c;一个学生可以选多个课程&#xff0c;一门课程也可以被多个学生选择。 再建一个学生表和课程表的中间表&#xff0c;包含学生id和课程id。 我们拿查询所有学生 和他们所选的课程为例&#xff0c;写多对多&#xff08;其实就是一对多&a…

05《存储器层次结构与接口》计算机组成与体系结构 系列课

目录 存储器层次结构概述 层次结构的定义 存储器的排名 存储器接口 处理器与存储器的速度匹配 存储器接口的定义 存储器访问命中率 两种接口 第1种方式&#xff1a;并行 命中率的计算 存储器访问时间 第2种方式&#xff1a;逐级 结语 大家好&#xff0c;欢迎回来。…

软件测试——性能测试工具JMeter

1.JMeter介绍 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。JMeter小巧轻便且免费&#xff0c;逐渐成为了主流的性能测试工具&#xff0c;是每个测试人员都必须要掌握的工具之一。 环境要求&#xff1a; ​ 需要Java8或者更高的版本。 1.1 JMeter的下…

ARP表、MAC表、路由表的区别和各自作用

文章目录 ARP表、MAC表、路由表的区别和各自作用同一网络内:ARP表request - 请求reply - 响应 MAC地址在同一网络内,交换机如何工作? 不同网络路由表不同网络通信流程PC1到路由器路由器到PC2 简短总结 ARP表、MAC表、路由表的区别和各自作用 同一网络内: ARP作用: 让发送方知…

【Azure Cache for Redis】Redis的导出页面无法配置Storage SAS时通过az cli来完成

问题描述 在Azure Redis的导出页面&#xff0c;突然不能配置Storage Account的SAS作为授权方式。 image.png 那么是否可以通过AZ CLI或者是Powershell来实现SAS的配置呢&#xff1f; 问题解答 可以的。使用 az redis export 可以实现 az redis export --container --prefix[--a…

【AI系统】昇腾 AI 架构介绍

昇腾 AI 架构介绍 昇腾计算的基础软硬件是产业的核⼼&#xff0c;也是 AI 计算能⼒的来源。华为&#xff0c;作为昇腾计算产业⽣态的⼀员&#xff0c;是基础软硬件系统的核⼼贡献者。昇腾计算软硬件包括硬件系统、基础软件和应⽤使能等。 而本书介绍的 AI 系统整体架构&#…

transformers microsoft--table-transformer 表格识别

一、安装包 pip install transformers pip install torch pip install SentencePiecepip install timm pip install accelerate pip install pytesseract pillow pandas pip install tesseract 下载模型&#xff1a; https://huggingface.co/microsoft/table-transformer-s…

给UE5优化一丢丢编辑器性能

背后的原理 先看FActorIterator的定义 /*** Actor iterator* Note that when Playing In Editor, this will find actors only in CurrentWorld*/ class FActorIterator : public TActorIteratorBase<FActorIterator> {//..... }找到基类TActorIteratorBase /*** Temp…

Q3营收同比增22.4%,即时配送高质量增长的美团未来何在?

首先&#xff0c;美团核心本地商业的稳健发展为其未来奠定了坚实的基础。核心本地商业营收达694亿元&#xff0c;同比增长20.2%&#xff0c;这显示出美团在本地生活服务领域的强大竞争力。随着中国经济的高质量发展和消费信心的提升&#xff0c;美团的年交易用户数、年活跃商户…

基于R语言森林生态系统结构、功能与稳定性分析与可视化

在生态学研究中&#xff0c;森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性&#xff0c;还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…

2024 ccpc 辽宁省赛 E(构造 思维?)L(二分+一点点数论知识?)

E 题意&#xff1a; 可以注意到&#xff1a; 我的两种方格都四个方格的大小。 所以 如果存在一种摆放方式 那么 4|nm。 再考虑一种特殊的情况 22 &#xff0c;此时虽然我的积是4 但是无法摆放的。 1>对于 4 | n,或者 4 | m.我直接摆放第二种方格就可以了。 如果我n 是4 的…

Leetcode 二叉树的锯齿形层序遍历

算法思想&#xff1a; 这段代码实现了 二叉树的锯齿形层序遍历&#xff0c;其核心思想是基于广度优先搜索&#xff08;BFS&#xff09;进行层序遍历&#xff0c;并根据当前层数决定从左到右或从右到左的顺序来组织每一层的节点值。 level.add 和 level.addFirst 有点类似单链…

c++哈希表(原理、实现、开放寻址法)适合新手

c系列哈希的原理及实现&#xff08;上&#xff09; 文章目录 c系列哈希的原理及实现&#xff08;上&#xff09;前言一、哈希的概念二、哈希冲突三、哈希冲突解决3.1、开放寻址法3.2、删除操作3.3、负载因子四、代码实现 总结 前言 红黑树平衡树和哈希有不同的用途。 红黑树、…

用MATLAB符号工具建立机器人的动力学模型

目录 介绍代码功能演示拉格朗日方法回顾求解符号表达式数值求解 介绍 开发机器人过程中经常需要用牛顿-拉格朗日法建立机器人的动力学模型&#xff0c;表示为二阶微分方程组。本文以一个二杆系统为例&#xff0c;介绍如何用MATLAB符号工具得到微分方程表达式&#xff0c;只需要…

MongoDB集群分片安装部署手册

文章目录 一、集群规划1.1 集群安装规划1.2 端口规划1.3 目录创建 二、mongodb安装&#xff08;三台均需要操作&#xff09;2.1 下载、解压2.2 配置环境变量 三、mongodb组件配置3.1 配置config server的副本集3.1.1 config配置文件3.1.2 config server启动3.1.3 初始化config …

java 调用 k8s crd 生成 crd model

k8s官方提供了自动生成Java模型代码的工具&#xff0c;使用指南&#xff1a; https://github.com/kubernetes-client/java提供有两种方法&#xff1a; github action远程生成本地docker镜像生成 本地docker镜像生成很简单&#xff0c;跟着官方指南下载镜像执行命令即可&…

36 基于单片机的电磁炉系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过DS18B20温度传感器检测温度&#xff0c;通过八位数码管显示&#xff0c; 如果温度超过阈值&#xff0c;则蜂鸣器报警&#xff0c;红灯亮起&#xff1b;若不超过阈值&…

IoTDB 常见问题 QA 第一期

开始&#xff01;关于 IoTDB 的 Q&A 我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;WAL 堆积导致写入失败 问题及现象 集群报错&#xff1a; The write is rejec…

buildroot 制作Linux嵌入式文件系统,并添加telnet 以及ssh

在开始配置前&#xff0c;我们需要了解SSH和Telnet的基本概念。SSH&#xff08;Secure Shell&#xff09;为加密的网络协议&#xff0c;用于在不安全的网络中执行命令并管理网络服务。相对于SSH&#xff0c;Telnet是一个老旧且非加密的协议&#xff0c;用于进行远程登录 sshd 服…

Simulink的SIL软件在环测试

以基于模型的设计&#xff08;MBD&#xff09;的软件开发时&#xff0c;需要进行SIL&#xff08;软件在环测试&#xff09;。SIL测试就是在PC上验证模型是否与代码功能一致。在项目开展中&#xff0c;用在需要将控制器生成移植到硬件前&#xff0c;把控制器的模块生成代码&…