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

C# 常量与变量:写给小白的入门指南

一、变量:会变的盒子

变量就像我们日常生活中的盒子,可以存放不同的东西。在 C# 里,每个盒子都有自己的类型:
 

int age = 30;      // 整数盒子
string name = "张三"; // 文字盒子
double height = 1.75; // 小数盒子

关键特性

1.可以随时修改内容

age = 31; // 盒子里的数字变了

2.自动推断类型(用 var)

var today = DateTime.Now; // 自动知道是日期类型

内存小故事

  • 值类型(如整数):像放在口袋里,随用随取
  • 引用类型(如字符串):像存在仓库,口袋里只存地址

二、常量:永远不变的标记

常量就像刻在石碑上的字,一旦写下就不能更改:

const double Pi = 3.14159; // 数学常数
const string Version = "v1.0"; // 版本号

使用场景

  • 固定不变的数据(如圆周率)
  • 配置参数(如 API 密钥)
  • 错误提示语(如 "网络连接失败")

与变量的区别

const int MaxRetry = 3; // 石碑上的字
int currentRetry = 0;  // 可以修改的计数器

三、只读字段:出生后不能变的属性

只读字段像出生证明上的信息,出生后就不能更改:

public class User {
    public readonly string Id; // 身份证号
    public User(string userId) {
        Id = userId; // 只能在出生时(构造函数)填写
    }
}

使用场景

  • 对象的唯一标识(如用户 ID)
  • 初始化后不变的配置(如数据库连接字符串)

四、常见误区与避坑指南

误区 1:把动态数据当常量

// 错误示范
const string UserName = GetCurrentUser(); 
// 错误原因:常量必须在编译时确定值

误区 2:过度使用常量

// 错误示范
const string ErrorMessage = "文件未找到"; // 应该用静态只读字段

正确做法

public static readonly string ErrorMessage = "文件未找到";

误区 3:忽略字符串驻留

// 重复创建相同字符串
string a = "Hello";
string b = "Hello"; // 其实它们指向同一块内存

五、性能优化小技巧

技巧 1:提取重复计算

// 重复计算
for (int i=0; i<1000; i++) {
    result += i * Math.PI;
}

// 优化方案
const double Pi = Math.PI;
for (int i=0; i<1000; i++) {
    result += i * Pi;
}

技巧 2:使用静态只读字段

public static class CountryCodes {
    public static readonly Dictionary<string, string> Codes = 
        new Dictionary<string, string> {
            {"CN", "中国"},
            {"US", "美国"}
        };
}

 六、实战案例:配置管理系统

public class AppConfig {
    // 编译时常量(固定不变)
    public const string Environment = "生产环境";
    public const int MaxConnections = 50;

    // 运行时常量(初始化后不变)
    public static readonly string[] AllowedOrigins = {
        "https://api.example.com",
        "https://www.example.com"
    };

    // 动态配置(可以修改)
    public static string DatabaseConnection { get; private set; }

    public static void LoadConfig() {
        DatabaseConnection = "Server=localhost;Database=MyDB";
    }
}

使用示例

Console.WriteLine($"当前环境:{AppConfig.Environment}");
Console.WriteLine($"最大连接数:{AppConfig.MaxConnections}");

七、常见问题解答

Q:const 和 readonly 有什么区别?

  • const:刻在石碑上(编译时确定)
  • readonly:写在纸上(运行时确定,但只能写一次)

Q:为什么字符串是特殊的引用类型?

  • 因为字符串内容不可变,相同内容的字符串会共享内存

Q:什么时候该用变量?什么时候该用常量?

  • 经常变化的数据 → 变量
  • 固定不变的数据 → 常量
  • 初始化后不变的数据 → 只读字段

完整概念速查表

分类概念说明
变量值类型存储在栈中(如 int, bool)
引用类型存储在堆中(如 string, class)
动态类型dynamic 关键字,运行时解析
常量const编译时常量,必须初始化
static readonly运行时常量,初始化后不可变
readonly 实例字段构造函数中初始化
内存管理栈分配局部变量,自动回收
堆分配引用类型,需 GC 管理
字符串驻留相同内容字符串共享内存


http://www.kler.cn/a/583238.html

相关文章:

  • 【Rust并发编程深度解析:内存模型与异步运行时实现原理】
  • 论文阅读 Quantum Convolutional neural network
  • OpenCV连续数字识别—可运行验证
  • Hive SQL 精进系列:字符串拼接的三种常用方式
  • 从0到1,带你开启PHP语言学习之旅
  • ESP-IDF ubuntu版本 V5.2
  • 【每日八股】Redis篇(七):集群
  • 深度学习中项目的环境配置与依赖下载
  • 基于Ubuntu 18.04搭建FTP云盘:开启私有云存储之旅
  • Python实现网络通信:Socket模块与TCP/IP协议全解析
  • 【Go学习】04-1-Gin框架-路由请求响应参数
  • sql server 2016 版本补丁说明
  • 颤抖:quiver,shiver,tremble的区别
  • SQL注入之sqli-labs靶场搭建
  • Linux 字符设备驱动实例
  • wpf中DataGrid组件每一行的背景色动态变化
  • 纯前端全文检索的两种实现方案:ElasticLunr.js 和 libsearch
  • 网络通信Socket中多态HandleIO设计模式深度解析
  • 打造Windows服务器安全堡垒:安当SLA双因素认证方案详解
  • Docker 入门与实战指南