You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:54:03