java可以用var定义吗_使用'var'会影响性能吗?

关于Java中使用`var`关键字,大多数观点认为它不会对运行时性能产生影响,因为编译器会在编译时确定变量的实际类型。然而,`var`可能导致编译器推断出接口类型而非具体实现,这在某些情况下可能影响效率。尽管如此,`var`主要是一种提升代码可读性的工具,尤其在处理匿名类型和长类型名称时。在方法返回接口时使用`var`可能会导致编译器选择接口类型,这与直接指定类型有所不同。总体而言,`var`的性能影响通常可以忽略不计,但在编写代码时仍应考虑其潜在的类型影响和可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回答(11)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

var 关键字没有额外的IL代码:对于非匿名类型,生成的IL应该是相同的 . 如果编译器可以找出您打算使用的类型,则会出现编译器错误 .

唯一的技巧是,如果你手动设置类型, var 将推断出你可能选择了接口或父类型的确切类型 .

8年后更新

我的理解已经改变,我需要更新它 . 我现在相信 var 可能会在方法返回接口的情况下影响性能,但您会使用精确类型 . 例如,如果您有此方法:

IList Foo()

{

return Enumerable.Range(0,10).ToList();

}

考虑这三行代码来调用该方法:

List bar1 = Foo();

IList bar = Foo();

var bar3 = Foo();

所有三个按预期编译和执行 . 但是,前两行不完全相同,第三行与第二行匹配,而不是第一行 . 因为 Foo() 的签名是返回 IList ,这就是编译器构建 bar3 变量的方式 .

请注意,它不能保证's possible (likely even) the jitter will be able to erase this difference, but it' . Generally, you should still consider var to be a non-factor in terms of performance. 这当然不像使用 dynamic 变量 . 但要说它根本没有任何区别可能会夸大它 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

正如Joel所说,编译器在编译时计算var应该是什么类型,实际上它只是编译器为保存击键而执行的一个技巧,例如

var s = "hi";

被替换为

string s = "hi";

在生成任何IL之前由编译器生成 . 生成的IL与您键入的字符串完全相同 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

至今没有人提到反射器......

如果编译以下C#代码:

static void Main(string[] args)

{

var x = "hello";

string y = "hello again!";

Console.WriteLine(x);

Console.WriteLine(y);

}

然后在上面使用反射器,你得到:

// Methods

private static void Main(string[] args)

{

string x = "hello";

string y = "hello again!";

Console.WriteLine(x);

Console.WriteLine(y);

}

所以答案很明显没有运行时性能!

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

对于以下方法:

private static void StringVsVarILOutput()

{

var string1 = new String(new char[9]);

string string2 = new String(new char[9]);

}

IL输出是这样的:

{

.method private hidebysig static void StringVsVarILOutput() cil managed

// Code size 28 (0x1c)

.maxstack 2

.locals init ([0] string string1,

[1] string string2)

IL_0000: nop

IL_0001: ldc.i4.s 9

IL_0003: newarr [mscorlib]System.Char

IL_0008: newobj instance void [mscorlib]System.String::.ctor(char[])

IL_000d: stloc.0

IL_000e: ldc.i4.s 9

IL_0010: newarr [mscorlib]System.Char

IL_0015: newobj instance void [mscorlib]System.String::.ctor(char[])

IL_001a: stloc.1

IL_001b: ret

} // end of method Program::StringVsVarILOutput

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

所以,要清楚,这是一种懒惰的编码风格 . 考虑到选择,我更喜欢原生类型;我将采取额外的“噪音”,以确保我正在编写和阅读我认为我在代码/调试时的确切内容 . 耸肩

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

C#编译器在编译时推断出 var 变量的真实类型 . 生成的IL没有区别 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我认为你没有正确理解你所读到的内容 . 如果它被编译为正确的类型,那么没有区别 . 当我这样做:

var i = 42;

编译器知道它是一个int,并生成代码,就像我写的一样

int i = 42;

正如您链接的帖子所说,它被编译为相同的类型 . 它不是运行时检查或其他需要额外代码的东西 . 编译器只是弄清楚类型必须是什么,并使用它 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

使用var没有运行时性能成本 . 虽然,我怀疑编译器需要推断出类型的编译性能成本,尽管这很可能是可以忽略不计的 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果编译器可以进行自动类型推理,那么性能就不会有任何问题 . 这两个都会生成相同的代码

var x = new ClassA();

ClassA x = new ClassA();

但是,如果你动态构造类型(LINQ ...),那么 var 是你唯一的问题,还有其他机制可以比较,以便说出什么是惩罚 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我总是在网络文章或指南着作中使用var这个词 .

在线文章的文本编辑器的宽度很小 .

如果我写这个:

SomeCoolNameSpace.SomeCoolClassName.SomeCoolSubClassName coolClass = new SomeCoolNameSpace.SomeCoolClassName.SomeCoolSubClassName();

您将看到上面呈现的预编码文本太长并且开箱即用,它会被隐藏 . 读者需要向右滚动才能看到完整的语法 .

这就是我总是在网络文章着作中使用关键字var的原因 .

var coolClass = new SomeCoolNameSpace.SomeCoolClassName.SomeCoolSubClassName();

整个渲染的预编码恰好适合屏幕 .

在实践中,为了声明对象,我很少使用var,我依靠intellisense来更快地声明对象 .

例:

SomeCoolNamespace.SomeCoolObject coolObject = new SomeCoolNamespace.SomeCoolObject();

但是,对于从方法返回对象,我使用var来更快地编写代码 .

例:

var coolObject = GetCoolObject(param1, param2);

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

“var”是人们喜欢或讨厌的东西之一(如地区) . 但是,与区域不同,var在创建匿名类时是绝对必要的 .

对我来说,当你直接创建一个对象时,var是有意义的:

var dict = new Dictionary();

话虽这么说,你可以轻松地做到:

Dictionary dict = new和intellisense将在这里填写其余部分 .

如果您只想使用特定的接口,那么除非您调用的方法直接返回接口,否则不能使用var .

Resharper似乎全都使用“var”,这可能会推动更多人这样做 . 但是我有点同意,如果你正在调用一个方法,那么它更难以阅读,并且名称返回的内容并不明显 .

var本身不会减慢任何速度,但有一点需要注意,这并不是很多人想到的 . 如果你执行 var result = SomeMethod(); ,那么之后的代码会在你调用各种方法或属性或其他任何东西的时候得到某种结果 . 如果 SomeMethod() 将其定义更改为其他类型,但它仍然符合其他代码所期望的 Contract ,那么您刚刚创建了一个非常讨厌的错误(当然,如果没有单元/集成测试) .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值