c#变量声明必须明确类型,int count = 0; 最稳妥;var仅限局部且需初始化;dynamic绕过编译检查易引发运行时错误;值类型有默认值,引用类型为null,初始化不可遗漏。

直接说结论:C#定义变量不是“选一种写法就行”,而是要根据作用域、可维护性、类型明确性来选——int count = 0; 是最稳的起点,var items = new List<string>();</string> 在局部上下文清晰时可用,但 dynamic obj = GetSomething(); 多数时候是给自己埋雷。
声明时必须指定类型,除非用 var(且仅限局部)
C# 是强类型语言,编译器需要在编译期就知道每个变量能存什么。所以像 count = 42; 这种写法会报错:CS0841: Cannot use local variable 'count' before it is declared。
-
int count = 42;—— 显式声明,类型一目了然,IDE 能准确跳转和提示 -
var name = "Alice";—— 合法,编译器推断出name是string,但不能写成var name;(未初始化)或var name = null;(无法推断) -
public var Id { get; set; }—— 非法,var不能用于字段、属性、参数、返回值
string、int?、List<t></t> 这些类型名不能省
类型名不是装饰,它决定了内存布局、默认值、空值行为和可调用的方法。比如:
-
string message;声明后值为null,后续调用message.Length会抛NullReferenceException -
string? message;(启用可空引用后)明确表示“允许为空”,编译器会警告你是否做了空检查 -
int count;声明后值是0(值类型的默认值),但若逻辑上“未设置”和“设为 0”有区别,就该用int? count; -
List<int> numbers = new();</int>(C# 9+)比new List<int>()</int>更简洁,但类型名List<int></int>仍不可省——否则 IDE 不知道你能调Add()还是First()
别把 dynamic 当成 var 的灵活版
dynamic 和 var 完全是两回事:var 是编译期推断的静态类型;dynamic 是绕过所有编译检查,所有成员访问都延迟到运行时解析。
-
var user = GetUser();→ 如果GetUser()返回User类型,那user.Name在编译期就校验通过 -
dynamic user = GetUser();→ 即使GetUser()返回object,user.Name也能过编译,但运行时若对象没有Name属性,就崩在RuntimeBinderException - 常见误用:用
dynamic解析 JSON 或 Excel 表格 → 失去 IDE 提示、单元测试难覆盖、错误只能上线后暴露
真正容易被忽略的是值类型和引用类型在初始化语义上的差异:声明一个 DateTime 变量不赋值,它已经是 DateTime.MinValue;而声明一个 HttpClient 不赋值,它就是 null。这种差异不会报编译错误,但会在运行时突然炸开——尤其在异步方法或构造函数中漏掉初始化时。











