一、变量基础
1. 声明与初始化
- 声明语法:<数据类型> <变量名>(如 int age; string name)
- 初始化要求:
1、 类或结构体中的字段变量(全局变量)无需显式初始化,默认值为 0 或 null,
2、方法内的局部变量必须显式初始化后才能使用(否则编译报错)
int globalVar; // 合法(全局变量默认0)
void MyMethod() { int localVar = 10; // 必须初始化
}
2. 类型推断
- var 关键字:编译器根据赋值自动推断变量类型(仅限局部变量)
var name = "Alice"; // 推断为 string
var num = 3.14; // 推断为 double
二、变量作用域规则
1. 作用域类型
作用域类型 | 定义范围 | 示例场景 |
---|---|---|
块级作用域 | {} 包围的代码块(C# 7+) | if / for / 自定义代码块内部 |
方法参数作用域 | 整个方法内可见 | 方法参数传递 |
全局变量作用域 | 类或结构体级别 | 类字段、静态变量 |
循环变量作用域 | 循环体内部 | for (int i=0; …) 中的 i |
2. 核心规则
- 局部变量:仅在其声明的代码块内有效
{ int blockVar = 20; Console.WriteLine(blockVar); // 合法
}
// Console.WriteLine(blockVar); // 报错:超出作用域
- 全局变量:类或结构体内所有方法可访问
class MyClass { int globalVar = 30; void MethodA() => globalVar = 40; void MethodB() => Console.WriteLine(globalVar);
}
- 静态变量:类级别作用域,通过类名访问
class MyClass { static int staticVar = 100;
}
// 访问方式:MyClass.staticVar
三、关键注意事项
1. 作用域冲突
- 局部变量与全局变量同名时,优先访问局部变量
int age = 30;
void MyMethod() { int age = 25; Console.WriteLine(age); // 输出25
}
2. 内存管理
- 栈内存:存放局部变量和参数,随代码块结束自动释放
- 堆内存:存放对象和引用类型数据,由垃圾回收器(GC)管理
3. 跨作用域访问限制
外层代码块无法访问内层代码块的变量
void OuterMethod() { if (true) { int innerVar = 10; } // Console.WriteLine(innerVar); // 报错
}
四、最佳实践建议
- 最小作用域原则:变量应在其最小必要范围内声明,减少命名冲突风险
- 避免全局滥用:全局变量易引发耦合问题,优先使用局部变量
- 显式初始化:即使允许默认值,也建议为全局变量显式赋初值
- 类型推断慎用:var 适用于类型名冗长或赋值表达式明确的场景(如 var list = new List())
总结
变量生命周期:
全局变量 → 类生命周期
静态变量 → 程序生命周期
局部变量 → 代码块/方法执行周期