C#中Object object = new()与var object = new Object()的差异及选型
两种实例化写法的等价性验证
你见到的new()是C# 9.0版本引入的目标类型推导new表达式语法糖,核心作用是让编译器根据赋值目标的类型自动推导要实例化的类型,不需要开发者显式重复声明。
只要代码上下文能让编译器明确推导出目标类型,两种写法编译生成的IL代码完全一致,运行时行为没有任何区别,是100%等价的。
你给出的示例代码中:
var object1 = new Object(); // 显式指定实例化类型,用var推导变量类型 Object object2 = new(); // 显式指定变量类型,用new()推导实例化类型
两行代码编译后没有任何差异,运行时生成的对象也完全一致。
注意:new()和你提到的new { }匿名对象语法完全无关,前者是命名类型的实例化语法糖,后者是创建无明确类型声明的匿名对象,二者使用场景完全独立,不要混淆。
最佳实践选用依据
行业通用的选择标准如下:
- 优先选择
new()的场景:- 变量/字段已经显式声明了类型,尤其是类型名较长(比如多层泛型
Dictionary<string, List<Dictionary<int, string>>>)时,可以大幅减少冗余代码,提升可读性 - 作为明确参数类型的方法入参时,比如方法签名为
void Log(LogEntry entry),调用时直接写Log(new());即可,无需重复写类型 - 团队代码规范明确允许/推荐使用该语法时
- 变量/字段已经显式声明了类型,尤其是类型名较长(比如多层泛型
- 不建议使用
new()的场景:- 用
var声明变量时,编译器无法推导new()对应的类型,会直接编译报错,这种场景必须显式指定实例化类型 - 上下文存在类型歧义时:比如存在两个重载方法
void Handle(User u)和void Handle(Order o),直接调用Handle(new())编译器无法确定目标类型,必须显式声明 - 团队规范要求所有实例化必须显式指定类型时,遵循团队规范优先
- 用
核心原则:同一个代码库内保持风格统一即可,两种写法没有性能层面的优劣,只有可读性和适配场景的差异。
内容的提问来源于stack exchange,提问作者aterbo
相关产品推荐
相关产品推荐

