关于C#的编程基础:数据类型与变量全解析

一.基本的数据类型

1.什么是数据类型

在编程语言中,数据类型(Data Type) 是对变量存储的 “数据的种类” 的定义,它决定了:

  • 变量可以存储哪些值(例如整数、文本、布尔值)。
  • 这些值在内存中如何存储(占用多少字节)。
  • 可以对这些值执行哪些操作(例如加法、比较、调用方法)。

为什么需要数据类型?

  1. 内存管理:不同类型的数据占用不同大小的内存(例如 int 通常占 4 字节,long 占 8 字节)。
  2. 操作安全:防止不合法的操作(例如对字符串执行除法)。
  3. 代码可读性:明确变量用途(例如 age 应为整数,而非字符串)。

常见数据类型分类

1. 值类型(Value Types)
  • 直接存储数据值,内存分配在栈(Stack)上。
  • 常见类型
    • 整数:无符号的八位整数byte(8 位)、有符号的八位整数:sbyte(八位)、有符号的16位整数short(16 位)、int(32 位)、long(64 位)。
    • 浮点数float(单精度)、double(双精度)。
    • 布尔值:逻辑值booltrue 或 false)。字节大小 :1
    • 字符char(单个 Unicode 字符,如 'A')。
    • 枚举enum):自定义命名常量集合。
    • 结构体struct):自定义值类型。

示例(C#)

int age = 25;          // 整数
double height = 1.75;  // 浮点数
bool isStudent = true; // 布尔值
char grade = 'A';      // 字符
2. 引用类型(Reference Types)
  • 存储数据的引用(内存地址),数据本身存储在堆(Heap)上。
  • 常见类型
    • 字符串string(不可变的字符序列,如 "Hello")。
    • 数组int[] numbers = new int[5];(存储固定大小的同类型元素)。
    • class):自定义引用类型,如 PersonList<T>
    • 接口interface):定义行为契约。
    • 委托delegate):函数指针。

示例(C#)

string name = "Alice";  // 字符串
int[] numbers = {1, 2, 3}; // 数组
3. 指针类型(Pointer Types)
  • 直接存储内存地址,主要用于高性能或系统级编程(C# 中需在 unsafe 上下文中使用)。
unsafe {int num = 10;int* p = &num; // 指向整数的指针
}
4. 特殊类型
  • dynamic:在运行时确定类型(C# 4.0+)。
    dynamic value = "Hello"; // 编译时不检查类型
    value = 123;             // 运行时动态绑定
    
  • object:所有类型的基类型(可存储任意类型的值)。
  • void:表示 “无返回值”(用于方法返回类型)。

类型转换

  • 隐式转换:小范围类型自动转为大范围类型(如 int → long)。
    int a = 10;
    long b = a; // 隐式转换
    
  • 显式转换(强制转换):大范围类型转为小范围类型(可能丢失数据)。
    double x = 3.14;
    int y = (int)x; // 显式转换,结果为 3
    
  • 方法转换:使用 Convert 类或类型自身的方法(如 int.Parse)。
    string s = "123";
    int num = int.Parse(s); // 字符串转整数
    

C# 中的泛型(Generic Types)

  • 参数化类型:定义时不指定具体类型,使用时再传入。
    List<int> numbers = new List<int>(); // 泛型集合,存储整数
    Dictionary<string, int> ages = new Dictionary<string, int>(); // 键值对
    

不同语言的数据类型差异

特性C#JavaScriptPython
静态类型是(编译时检查类型)否(动态类型)否(动态类型)
内置整数类型byteshortint统一为 Number统一为 int
字符串类型不可变 string不可变 string不可变 str
数组固定类型 int[]动态类型 []动态类型 list

  二.常量、变量、运算符、表达式、语句

1.常量

常量是在程序运行过程中值始终保持不变的量。它的值在定义时被确定,之后无法修改。

常量定义的格式:const int a=10;

  • 常见类型

    • 数值常量:如整数(100)、浮点数(3.14)。
    • 字符串常量:用引号括起来的文本,如"Hello"'编程'
    • 布尔常量:True(真)或False(假)(部分语言中用10表示)。
    • 特殊常量:如 Python 中的None(表示空值)、数学中的π(圆周率,约 3.14159)。

2.变量

变量是在程序运行过程中值可以被修改的量,它用于存储数据,相当于一个 “容器”,有自己的名称(变量名)和数据类型。

变量定义的格式:类型修饰符    变量名 = 初始值

例如:int age = 2;

类型修饰符:规定了变量的空间大小,以及变量的数据类型

变量名:变量的名字,起标识作用

初始值:变量定义的默认值

使用float的时候要在数字后加一个f,double后必须加入一个d

3.常量和变量的命名规则

  1. 只能包含特定字符

    • 允许使用字母(a-zA-Z)、数字(0-9)和下划线(_)。
    • 不能以数字开头,例如123name是非法的,而name123合法。
  2. 区分大小写

    • 变量ageAge是不同的变量(如 Python、Java、C++ 等语言)。
  3. 不能使用关键字

    • 不能使用编程语言的保留字(如ifelseforclass等)作为名称。
    • 例如,在 Python 中if = 5会报错,因为if是关键字。
  4. 建议使用有意义的名称

    • 变量名应反映其用途,例如用age存储年龄,而不是用无意义的a
    • 常量名通常使用全大写字母,例如MAX_VALUE

4.运算符 

(1)赋值运算符

用于给变量赋值,将右边的值赋值给左边

赋值运算优先级较低

(2)算数运算符

用于参与计算

(3)++运算符和--运算符

a++等价于a=a+1

++age是让age加一在进行赋值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _01
{internal class Program{static void Main(string[] args){int num = 10;num = num++ + --num - ++num;Console.WriteLine(num);}}
}

(4)复合运算符 

a+=b等价于a=+b

5.表达式

表达式是由常量、变量、运算符组合而成的式子,它会被计算并返回一个结果。

  • 特点

    • 表达式必须有明确的计算结果,结果的类型由参与运算的元素决定(如数值表达式返回数值,布尔表达式返回布尔值)。
    • 表达式不能单独作为程序的执行单位,通常用于赋值、判断条件等场景。
  • 示例

    • 数值表达式:3 + 5 * 2(结果 13)、x / 10x是变量)。
    • 布尔表达式:age > 18 and score >= 60(判断年龄是否大于 18 且分数是否不低于 60)。
    • 字符串表达式:"Hello" + " " + "World"(结果"Hello World")。

6.语句 

程序执行的最小单位,在c#中每一句都有分号结尾

7.数据类型的转换 

(1)隐式转换

特点:从小范围类型到大范围类型的安全转换,无需显式语法。
适用场景:例如intdoublecharint等。

int num = 10;
double d = num;  // 隐式转换:int → double(10 → 10.0)char c = 'A';
int code = c;    // 隐式转换:char → int('A' → 65,ASCII码)

(2)显式转换(强制转换)

特点:从大范围类型到小范围类型的转换,可能丢失数据,需用(目标类型)语法。
适用场景:例如doubleintobject转具体类型。

double d = 3.14;
int num = (int)d;  // 显式转换:double → int(3.14 → 3,截断小数部分)object obj = "Hello";
string str = (string)obj;  // 显式转换:object → string

注意:强制转换可能引发InvalidCastException(如将int类型的object转为string)。

(3)类型转换方法

1. ToString()

将任意类型转换为字符串。

int num = 123;
string str = num.ToString();  // "123"bool isTrue = true;
string result = isTrue.ToString();  // "True"
2. GetTypeCode()

获取值类型的类型代码,结合TypeCode枚举判断类型。

int num = 10;
TypeCode typeCode = num.GetTypeCode();  // TypeCode.Int32

(4)Convert 类

特点:提供静态方法进行类型转换,自动处理格式和范围问题,更安全。
常用方法ToInt32()ToDouble()ToString()ToBoolean()等。

string str = "123";
int num = Convert.ToInt32(str);  // 字符串 → 整数(123)object obj = 3.14;
double d = Convert.ToDouble(obj);  // object → double(3.14)string boolStr = "true";
bool isTrue = Convert.ToBoolean(boolStr);  // 字符串 → 布尔值(true)

注意:若转换失败(如"abc"int),会抛出FormatException

(5)Parse 与 TryParse(字符串转数值)

1. Parse()

直接解析字符串为目标类型,失败时抛出异常

string str = "456";
int num = int.Parse(str);  // 解析为整数(456)// 若字符串格式错误,会抛出FormatException
// string invalidStr = "abc";
// int error = int.Parse(invalidStr);  // 错误!
2. TryParse()

安全解析字符串,返回布尔值表示成功或失败,结果通过out参数输出。

string str = "789";
if (int.TryParse(str, out int result))
{Console.WriteLine($"解析成功:{result}");  // 输出:解析成功:789
}
else
{Console.WriteLine("解析失败");
}

推荐:优先使用TryParse()避免异常,提高程序健壮性。

(6)自定义类型转换

1. 实现接口

通过实现IConvertible接口自定义类型转换逻辑。

public class Person : IConvertible
{public string Name { get; set; }public int Age { get; set; }// 实现IConvertible接口的方法(略)public TypeCode GetTypeCode() => TypeCode.Object;// 其他方法...
}
2. 转换运算符

使用implicit(隐式)或explicit(显式)关键字定义自定义类型转换。

public class Meter
{public double Value { get; set; }// 隐式转换:Meter → Kilometerpublic static implicit operator Kilometer(Meter meter){return new Kilometer { Value = meter.Value / 1000 };}// 显式转换:Kilometer → Meterpublic static explicit operator Meter(Kilometer km){return new Meter { Value = km.Value * 1000 };}
}public class Kilometer
{public double Value { get; set; }
}// 使用示例
Meter m = new Meter { Value = 5000 };
Kilometer km = m;  // 隐式转换
Meter newM = (Meter)km;  // 显式转换

(7)装箱与拆箱

1. 装箱(Boxing)

将值类型转换为引用类型(如intobject)。

int num = 100;
object obj = num;  // 装箱:值类型 → object
2. 拆箱(Unboxing)

将引用类型转换回值类型,需显式转换。

object obj = 100;
int num = (int)obj;  // 拆箱:object → int

注意:频繁装箱拆箱会影响性能,建议优先使用泛型集合(如List<int>)替代ArrayList

(8)总结与选择建议

转换方式适用场景示例
隐式转换小范围类型到大范围类型的安全转换int → double
显式转换(强制)大范围类型到小范围类型的转换(可能丢失数据)double → int
Convert 类不同类型间的安全转换(如字符串转数值、对象转基本类型)Convert.ToInt32("123")
Parse/TryParse字符串解析为数值类型,TryParse 更安全(避免异常)int.TryParse("123", out num)
自定义转换自定义类型之间的转换(通过运算符或接口)implicit operator
装箱 / 拆箱值类型与引用类型(如object)之间的转换,性能开销大int → object → int

三.基本输入、输出函数 

场景常用方法 / 类示例代码
控制台输出Console.WriteLine()Console.WriteLine("Hello");
控制台输入Console.ReadLine()string name = Console.ReadLine();
文件写入File.WriteAllText()File.WriteAllText("test.txt", "内容");
文件读取File.ReadAllText()string content = File.ReadAllText("test.txt");
二进制写入BinaryWriterusing (var writer = new BinaryWriter(File.Create("data.bin"))) { writer.Write(123); }
二进制读取BinaryReaderusing (var reader = new BinaryReader(File.Open("data.bin", FileMode.Open))) { int num = reader.ReadInt32(); }

输出函数: 

 Console.WriteLine输出换行

Console.Write输出不换行

输入函数:

Console.Read读取一个字符

Console.ReadLine:读取一个字符串

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _02
{internal class Program{static void Main(string[] args){string myname = "syn";string inputname = Console.ReadLine();Console.WriteLine("您输入的内容是");Console.WriteLine(inputname);}}
}

四.关于c#语言的msdn文档网址

https://learn.microsoft.com/zh-cn/dotnet/api/system.reflection.fieldinfo?view=net-9.0&viewFallbackFrom=nelframework-4.7.2

 

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

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

相关文章

深入解析 Spring 获取 XML 验证模式的过程

关键要点Spring 的 XML 验证模式&#xff1a;Spring 框架在加载 XML 配置文件时&#xff0c;会根据文件内容判断使用 DTD&#xff08;文档类型定义&#xff09;或 XSD&#xff08;XML 模式定义&#xff09;进行验证。自动检测机制&#xff1a;Spring 默认使用自动检测&#xff…

复现《Local GDP Estimates Around the World》论文的完整指南

复现《Local GDP Estimates Around the World》论文的完整指南 1. 引言 1.1 论文概述 《Local GDP Estimates Around the World》是一篇重要的经济地理学研究论文&#xff0c;作者提出了一种创新的方法来估计全球范围内次国家层面的GDP数据。这项工作填补了全球经济发展研究中子…

Sql注入 之sqlmap使用教程

一、安装sqlmap 浏览器访问SQLmap官网 即可下载工具&#xff1b;需要说明的是&#xff0c;SQLmap运行依赖于python环境&#xff0c;所以在下载使用前务必在电脑及终端上安装好python环境。 通过网盘分享的文件&#xff1a;sqlmap-master.zip链接: https://pan.baidu.com/s/1YZi…

安宝特案例丨户外通信机房施工革新:AR+作业流技术破解行业难题

在数字化浪潮席卷各行各业的今天&#xff0c;传统户外通信机房建设领域正经历一场静悄悄的变革。作为信息社会的“神经枢纽”&#xff0c;户外机房的质量直接关系到通信网络的稳定性&#xff0c;但长期以来&#xff0c;这一领域却深受施工标准化不足、质量管控难、验收追溯复杂…

在 CentOS 中安装 MySQL 的过程与问题解决方案

MySQL 是一款广泛使用的开源关系型数据库管理系统&#xff0c;在 CentOS 系统中安装 MySQL 是很多开发者和运维人员常做的工作。下面将详细介绍安装过程以及可能遇到的问题和解决方案。 一、安装前的准备工作 在安装 MySQL 之前&#xff0c;需要做好一些准备工作&#xff0c;…

阿里 Qwen3 四模型齐发,字节 Coze 全面开源,GPT-5 8 月初发布!| AI Weekly 7.21-7.27

&#x1f4e2;本周AI快讯 | 1分钟速览&#x1f680;1️⃣ &#x1f9e0; 阿里 Qwen3 全系列爆发 &#xff1a;一周内密集发布四款新模型&#xff0c;包括 Qwen3-235B-A22B-Thinking-2507、Qwen3-Coder 和 Qwen3-MT&#xff0c;MMLU-Pro 成绩超越 Claude Opus 4&#xff0c;百万…

C语言第 9 天学习笔记:数组(二维数组与字符数组)

C语言第09天学习笔记&#xff1a;数组&#xff08;二维数组与字符数组&#xff09; 内容提要 数组 二维数组字符数组二维数组 定义 二维数组本质上是一个行列式组合&#xff0c;由行和列两部分组成&#xff0c;属于多维数组&#xff0c;通过行和列解读&#xff08;先行后列&…

使用OpenCV做个图片校正工具

昨天有位兄台给我发了个文件&#xff0c;是下面这个样子的&#xff1a;那一双小脚既没有裹成三寸金莲&#xff0c;又没有黑丝&#xff0c;这图片肯定不符合我的要求。我要的是这个样子的好不好&#xff1a;让他拿扫描仪重新给我规规矩矩扫一个发过来&#xff1f;他要能用扫描仪…

《不只是接口:GraphQL与RESTful的本质差异》

RESTful API凭借其与HTTP协议的天然融合&#xff0c;以资源为核心的架构理念&#xff0c;在过去十余年里构建了Web数据交互的基本秩序&#xff1b;而GraphQL的出现&#xff0c;以“按需获取”为核心的查询模式&#xff0c;打破了传统的请求-响应逻辑&#xff0c;重新定义了前端…

博士招生 | 香港大学 招收人工智能和网络安全方向 博士生

学校简介香港大学创立于 1911 年&#xff0c;是香港历史最悠久的高等学府&#xff0c;QS 2025 世界排名第 17 位。计算机科学学科在 QS 2025 学科排名中位列全球第 31 位、亚洲第 5 位。计算机系&#xff08;Department of Computer Science&#xff09;下设系统、人工智能、数…

Linux知识回顾总结----基础IO

目录 1. 理解“文件” 1.1 文件的定义 2. 回顾 C 语言的文件操作 2.1 文件操作 2.2 实现cat 2.3 可以实现打印的几种方式 3. 系统文件的IO 3.2 使用系统的接口 3.3 内部的实现 3.4 重定向 4. 文件系统的内核结构 5. 缓冲区 5.1 是什么 5.2 为什么 5.3 有什么 5.4 见见…

网络:基础概念

网络&#xff1a;基础概念 在计算机发展过程中&#xff0c;最开始每个计算机时相互独立的&#xff0c;后来人们需要用计算机合作处理任务&#xff0c;这就牵扯到了数据交换&#xff0c;所以最开始的网络就诞生了。一开始&#xff0c;网络都是局域网LAN&#xff0c;后来技术成熟…

图像识别边缘算法

文章目录1. 基本概念2. 边缘检测原理边缘类型&#xff1a;3. 常见边缘检测算法3.1 Sobel算子3.2 Canny边缘检测3.3 Laplacian算子4. Canny边缘检测详细流程流程图示例&#xff1a;详细步骤说明&#xff1a;5. 边缘检测算法比较6. 参数调优建议Canny边缘检测参数&#xff1a;Sob…

【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(终)

&#x1f9ea; 测试与质量保证 &#x1f50d; 全方位测试体系 我建立了企业级的全方位测试体系来确保系统质量&#xff1a; &#x1f9ea; 测试金字塔模型 #mermaid-svg-u4I8UuUAyxJVjcqs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…

QT开发---网络编程下

HTTP协议 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的协议之一&#xff0c;用于客户端和服务器之间的通信。默认端口80&#xff0c;传输层使用的是TCP协议特点无连接&#xff1a;HTTP协议是无连接的&#xff…

mac 苹果电脑 Intel 芯片(Mac X86) 安卓虚拟机 Android模拟器 的救命稻草(下载安装指南)

引言&#xff1a; 还在为你的Intel芯片MacBook&#xff08;i5, i7, i9等&#xff09;找不到合适的安卓虚拟机而发愁吗&#xff1f;随着Apple Silicon (M1/M2/M3) 芯片的普及&#xff0c;大量优秀的安卓模拟器&#xff08;如Android Studio自带的模拟器、网易MuMu等&#xff09;…

C语言:顺序表(上)

C语言&#xff1a;顺序表&#xff08;上&#xff09; 1.顺序表的介绍 2.顺序表的实现 1.顺序表的介绍 线性表是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在…

GPT - 5被曝将在8月初发布!并同步推出mini、nano版

据《TheVerge》最新报道&#xff0c;OpenAI 正准备在 8 月发布新版本旗舰大模型 GPT-5&#xff0c;如果顺利的话发布节点最早会在 8 月初。同时&#xff0c;下个月发布 GPT-5 时&#xff0c;还会一并推出 mini&#xff08;小型&#xff09;和 nano&#xff08;微型&#xff09;…

【Linux操作系统】简学深悟启示录:Linux环境基础开发工具使用

文章目录1.软件包管理器yum2.Linux编辑器vim2.1 三模式切换2.2 正常模式2.3 底行模式2.4 可视化模式2.5 vim 配置3.Linux编译器gcc/g3.1 预处理3.2 编译3.3 汇编3.4 连接3.5 函数库4.Linux自动化构建工具Makefile5.Linux调试器gdb希望读者们多多三连支持小编会继续更新你们的鼓…

八大神经网络的区别

神经网络名称全称/修正名称主要作用核心特点典型应用场景CINICNN&#xff08;卷积神经网络&#xff09;处理图像、视频等空间数据&#xff0c;提取局部特征。使用卷积核、池化操作&#xff1b;擅长平移不变性。图像分类、目标检测、人脸识别。RINIRNN&#xff08;循环神经网络&…