C# 数据类型详解

在 C# 中,数据类型是定义变量所能存储数据类型的方式。C# 中的数据类型大致可以分为三类:值类型(Value Types)引用类型(Reference Types)指针类型(Pointer Types)。本文将详细介绍这三种类型的特点及使用。

1. 值类型(Value Types)

值类型直接包含数据的值,它们存储在栈(Stack)上。当你将值类型的变量赋值给另一个变量时,实际是将数据的副本传递给了另一个变量。C# 中的所有数值类型(如整数、浮点数等)都属于值类型。

常见的值类型:
类型 描述 范围 默认值
bool 布尔类型 truefalse false
byte 8 位无符号整数 0 到 255 0
char 16 位 Unicode 字符 U+0000 到 U+FFFF '\0'
decimal 高精度十进制数(128 位) (-7.9 x 10^28 到 7.9 x 10^28)/100 到 28 0.0M
double 64 位双精度浮点数 (+/-)5.0 x 10^-324 到 (+/-)1.7 x 10^308 0.0D
float 32 位单精度浮点数 -3.4 x 10^38 到 +3.4 x 10^38 0.0F
int 32 位有符号整数 -2,147,483,648 到 2,147,483,647 0
long 64 位有符号整数 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 0L
sbyte 8 位有符号整数 -128 到 127 0
short 16 位有符号整数 -32,768 到 32,767 0
uint 32 位无符号整数 0 到 4,294,967,295 0
ulong 64 位无符号整数 0 到 18,446,744,073,709,551,615 0
ushort 16 位无符号整数 0 到 65,535 0

你可以使用 sizeof 运算符来获取特定类型在内存中的大小:

csharp 复制代码
using System;

namespace DataTypeExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Size of int: {0} bytes", sizeof(int));
        }
    }
}

输出:

复制代码
Size of int: 4 bytes

2. 引用类型(Reference Types)

引用类型与值类型不同,它们不直接存储数据,而是存储数据的引用(即内存地址)。当一个引用类型的变量赋值给另一个变量时,它们指向同一个内存位置。因此,修改一个变量的值会影响到另一个变量。

常见的引用类型:
类型 描述 示例
object 所有数据类型的基类 object obj = 100;
dynamic 动态类型,类型检查在运行时发生 dynamic dynVar = 10; dynVar = "Hello, World!";
string 字符串类型(引号或逐字字符串) string str = "C# is awesome!";
示例:对象类型
csharp 复制代码
object obj = 100;  // 这里是值类型装箱(Boxing)
Console.WriteLine(obj);  // 输出: 100
示例:动态类型
csharp 复制代码
dynamic dynVar = 10;
Console.WriteLine(dynVar);  // 输出: 10
dynVar = "Hello, World!";
Console.WriteLine(dynVar);  // 输出: Hello, World!
示例:字符串类型
csharp 复制代码
string str = "C# is great!";
Console.WriteLine(str);  // 输出: C# is great!

// 逐字字符串
string filePath = @"C:\Windows\System32";
Console.WriteLine(filePath);  // 输出: C:\Windows\System32

3. 值类型与引用类型的比较

为了更加直观地展示值类型和引用类型之间的区别,我们可以通过以下表格来对比:

特性 值类型(Value Types) 引用类型(Reference Types)
存储位置 栈(Stack) 堆(Heap)
赋值行为 直接复制值,赋值后的变量互不影响 赋值时传递内存地址,赋值后的变量共享相同的数据
默认值 每个值类型都有一个默认值,如 0false'\0' 默认值为 null
例子 intfloatcharbool stringobjectdynamicclass
内存管理 自动释放,生命周期由栈的作用域控制 必须通过垃圾回收机制进行内存管理
传递方式 传递数据副本 传递引用,即内存地址
速度 相对较快(因为存储在栈中,内存访问速度较快) 相对较慢(由于引用类型存储在堆中,访问速度较慢)

4. 指针类型(Pointer Types)

指针类型在 C# 中并不常见,通常只有在启用"不安全代码"(Unsafe Code)时才能使用。指针变量存储其他类型变量的内存地址,类似于 C 或 C++ 中的指针。指针类型常用于需要直接操作内存的低级编程。

csharp 复制代码
unsafe
{
    int num = 10;
    int* p = #  // 获取变量 num 的内存地址
    Console.WriteLine((int)p);  // 输出 num 的内存地址
}

需要注意的是,使用指针时需要在项目中启用"不安全代码"选项,并且代码中的指针类型必须使用 unsafe 关键字。

总结

C# 提供了多种数据类型,满足不同编程需求。值类型适合存储简单数据,引用类型则适合更复杂的数据结构,而指针类型则为高级开发提供了内存控制的能力。在编程过程中,选择合适的数据类型能够有效地提高程序的性能与可维护性。

希望本文能够帮助你更好地理解 C# 中的数据类型。如果你有任何问题或进一步的讨论,欢迎在评论区留言。

相关推荐
hixiong12311 小时前
C# TensorRT部署RF-DETR目标检测&分割模型
人工智能·目标检测·计算机视觉·ai·c#
神仙别闹17 小时前
基于C# 利用工程活动图 AOE 网设计算法
算法·c#·php
游乐码17 小时前
c#迭代器
开发语言·c#
海盗123417 小时前
C# OPC UA客户端开发实战
服务器·开发语言·c#
asdzx6717 小时前
使用 C# 从 URL 下载 Word 文档
开发语言·c#·word
xiaoshuaishuai818 小时前
C# DeepSeek V4 与 V3对比
开发语言·c#·量子计算
游乐码19 小时前
c#特殊语法
开发语言·c#
.NET修仙日记20 小时前
2026 .NET 面试八股文:高频题 + 答案 + 原理(高级核心篇)
面试·职场和发展·c#·.net·.net core·.net 8
唐青枫21 小时前
终于不用手搓两级缓存了!C#.NET HybridCache 详解:L1 L2、标签失效与防击穿实战
c#·.net
hixiong1231 天前
C# OpenvinoSharp使用DINOv2模型进行图像相似度计算
开发语言·c#