可能重复:
ReSharper和var
在我安装了ReSharper后,它要求(通过警告)我尽可能使用var,例如
UnhandledExceptionEventArgs ue = (UnhandledExceptionEventArgs) t;
Run Code Online (Sandbox Code Playgroud)
ReSharper想把它变成
var ue = (UnhandledExceptionEventArgs) t;
Run Code Online (Sandbox Code Playgroud)
我更喜欢第一个版本,有没有理由更喜欢var?更好的性能?什么?或者它只是一种代码风格?
此基准测试似乎表明直接在对象引用上调用虚方法比在对象实现的接口的引用上调用它更快.
换一种说法:
interface IFoo {
void Bar();
}
class Foo : IFoo {
public virtual void Bar() {}
}
void Benchmark() {
Foo f = new Foo();
IFoo f2 = f;
f.Bar(); // This is faster.
f2.Bar();
}
Run Code Online (Sandbox Code Playgroud)
来自C++世界,我原本预计这两个调用都将以相同的方式实现(作为简单的虚拟表查找)并具有相同的性能.C#如何实现虚拟调用以及通过接口调用时显然可以完成的"额外"工作是什么?
好的,答案/评论我到目前为止暗示了通过接口进行虚拟呼叫的双指针解除引用,而不是通过对象进行虚拟呼叫的一个取消引用.
那么请有人解释为什么这是必要的?C#中虚拟表的结构是什么?是否"平坦"(对于C++来说是典型的)或不是?在C#语言设计中做出的设计权衡导致了什么?我不是说这是一个"糟糕"的设计,我只是好奇为什么它是必要的.
简而言之,我想了解我的工具在引擎盖下做了什么,这样我就可以更有效地使用它.如果我不再获得"你不应该知道"或"使用其他语言"类型的答案,我将不胜感激.
为了说清楚,我们没有在这里处理一些JIT优化的编译器,它删除了动态调度:我修改了原始问题中提到的基准,以在运行时随机实例化一个类或另一个类.由于实例化在编译之后和程序集加载/ JITing之后发生,因此在这两种情况下都无法避免动态调度:
interface IFoo {
void Bar();
}
class Foo : IFoo {
public virtual void Bar() {
}
}
class Foo2 : Foo {
public override void Bar() { …Run Code Online (Sandbox Code Playgroud) 可能重复:
将C#var重构为显式类型的工具
Visual Studio是否有任何类型的快捷方式(快捷方式意味着写出实际的类型名称),允许您编写"var"并将其转换为实际的类型名称?
例如:
var x = new Dictionary<string, string>();
Run Code Online (Sandbox Code Playgroud)
::做神奇的事情::
Dictionary<string, string> x = new Dictionary<string, string>();
Run Code Online (Sandbox Code Playgroud)
编辑 - 对所有问题的仇恨:我问,因为我想在我的解决方案中找到对特定类型的所有引用.Vars不会出现在该搜索中.
我现在正在学习C++,因为我需要编写一些低级程序.
当我了解"auto"关键字时,它会从C#中提醒我"var"关键字.
那么,C#"var"和C++"auto"的区别是什么?
我发现该var关键字极大地有助于降低C#代码中的噪声,几乎不会损失可读性; 我会说我现在只在编译器强迫我使用时才使用显式输入.
我知道使用var不会改变我的代码的运行时特性.但问题刚刚发生在我身上:我是否在编译时为编译器正在为我做的所有额外工作付出了巨大的代价?
有没有人做过任何基准测试,看看var对编译时间的广泛使用有多大区别?
以下变量初始化之间的运行时性能是否有任何差异?
var x = null as object;
var x = (object) null;
object x = null;
Run Code Online (Sandbox Code Playgroud) 可能重复:
C#'var'与特定类型性能
大家好,
我最近看到的代码使用var了很多.
例如:
var myString = GetAnyString();
var myInstance = GetClass();
Run Code Online (Sandbox Code Playgroud)
代替
string myString = GetAnyString();
MyClass myInstance = GetClass();
Run Code Online (Sandbox Code Playgroud)
除了可读性(我认为使用var不是很易读),使用它有什么优点和/或缺点吗?性能如何?
我有2,500,000个产品名称,我想尝试将它们组合在一起,即找到名称相似的产品.例如,我可以有三种产品:
这实际上是相同的产品,可以合并在一起.
我的计划是使用Jaro Winkler的距离算法来实现匹配.该过程如下:
所以这有一些优化,因为它只对每个产品进行单向匹配,节省了一半的处理时间.
我把它编码并测试了它.它运作完美,并发现了数十个匹配的调查.
将1个产品与2,500,000个其他产品进行比较需要大约20秒钟,并计算出"Jaro评分".假设我的计算是正确的,这意味着它将花费一年的最佳时间来完成处理.
显然这不实用.
我让同事们查看代码,他们设法将Jaro分数计算部分的速度提高了20%.他们使这个过程成为多线程,并使其更快一点.我们还删除了一些存储的信息,将其简化为产品名称和唯一标识符列表; 这似乎对处理时间没有任何影响.
通过这些改进,我们仍然认为这需要几个月的时间来处理,我们需要花费数小时(或最多几天).
我不想详细介绍,因为我认为这不是完全相关的,但我将产品详细信息加载到列表中:
private class Product
{
public int MemberId;
public string MemberName;
public int ProductId;
public string ProductCode;
public string ProductName;
}
private class ProductList : List<Product> { }
private readonly ProductList _pl = new ProductList();
Run Code Online (Sandbox Code Playgroud)
然后我使用以下处理每个产品:
{Outer loop...
var match = _pl[matchCount];
for (int count = 1; count < _pl.Count; count++)
{
var search = _pl[count];
//Don't match …Run Code Online (Sandbox Code Playgroud) 我使用的语言是C#.
让我们有一个类型的对象列表T,
List<T> collection = new List<T>{.....};
Run Code Online (Sandbox Code Playgroud)
假设我们想要查看每个收集项目.这可以通过多种方式完成.其中,有以下两种:
foreach(var item in collection)
{
// code goes here
}
Run Code Online (Sandbox Code Playgroud)
和
foreach(T item in collection)
{
// code goes here
}
Run Code Online (Sandbox Code Playgroud)
第二种方式是否优于第一种方式,为什么?
提前感谢您的回答.
起初我想的是:
var aName=getAllSomethings();
Run Code Online (Sandbox Code Playgroud)
是非常不可读的,所以我会在没有混淆的空间时使用动态类型,例如:
AClassName aName = new AClassName();
Run Code Online (Sandbox Code Playgroud)
这里,
var aName=new AClassName();
Run Code Online (Sandbox Code Playgroud)
似乎可读.但是,我(这里)读到动态类型也会带来性能代价.
我尝试阅读该链接中的所有其他帖子,以了解我应该在哪里使用动态类型,但是甚至没有提出一个很好的理由.我应该等待,直到我告诉自己 - "这只能用动态打字来解决"?或者是否有更好(实际)的理由使用它?
谢谢.
编辑:我的错误( - :将尽快关闭此问题.
c# ×10
var ×5
.net ×3
.net-4.0 ×1
algorithm ×1
auto ×1
c#-4.0 ×1
c++ ×1
coding-style ×1
duplicates ×1
foreach ×1
fuzzy-logic ×1
grouping ×1
null ×1
performance ×1
resharper ×1
types ×1