这个问题已经有一个答案在这里:

这是一个问题,当程我总是想知道:什么时使用我们正在编写代码:

var myFiles = Directory.GetFiles(fullPath);

string[] myFiles = Directory.GetFiles(fullPath);

var 是新的,并且是一个 隐含类型的局部变量, 所以我们只能使用当地和它有规则,如不能为空等, 但我不知道,如果我们获得的任何利用其"正常".

"正常"部分的说不在 匿名的类型, 目和收集的初始化查询的表情 那是意图使用var匿名的目的,所以我的意思是...就像上面的例子。

你有什么想法?

有帮助吗?

解决方案

除了显而易见的使用 var 与皇宫,我还用它来缩写的毛茸茸的变声明的可读性,例如:

var d = new Dictionary<string, Dictionary<string, Queue<SomeClass>>>();

在一般情况下,我获得一种舒适(为希望一个更好的词)从静态的输入,这使得我不愿意放弃它。我喜欢这感觉,我知道我在做什么当我宣布一个变量。宣布一个可变的不只是告诉编译器的东西,这是告诉人读你的代码的东西。

让我给你一个例子。假设我有一个方法,该方法返回 List<string>.这个代码肯定是正确的,我认为这是如何在90%的开发商可能会把它写:

List<string> list = MyMethod();

显然,对吗?事实上,这里的一个地方你可以很容易地使用 var.

真够的。但 代码版本并不只是宣布一个可变的,它告诉我是什么人是谁写的,它是打算要做的:

IEnumerable<string> list = MyMethod();

开发谁写的代码告诉我"我不会被改变这一名单,我也不要利用索引的访问其成员。所有我要做的就是迭代跨越它。" 这是一个很大的信息,以获得在一个单一行代码。这件事情你放弃的如果你使用 var.

当然,你不会放弃的如果你没有使用它放在第一位。如果你是那种开发商将编写这一行代码,你已经知道,你不会用 var 那里。

编辑:

我刚才重读乔恩的飞碟的帖子,这引自埃里克利珀特跳了出来我:

隐型人只是一个小小的方式,可以在其弱化该如何以及由此而强调的是什么。

我认为,实际上在很多情况下,使用隐含的打字是留下什么是默示的。它只是确定不是住在什么。例如,我会随便写一个皇宫的查询,如:

var rows = from DataRow r in parentRow.GetChildRows(myRelation)
           where r.Field<bool>("Flag")
           orderby r.Field<int>("SortKey")
           select r;

当我读到的那个代码,有一件事我想,当我在读它是"rows 是一个 IEnumerable<DataRow>." 因为我知道什么皇宫查询的回报 IEnumerable<T>, 我可以看到类型的对象是选择正确的。

这是一个情况下什么 还没有 已经作出明确的。它一直为我留下来推断。

现在,在大约90%的情况下,我使用皇宫,这不重要的一个小点点。因为90%的时候,下一行代码是:

foreach (DataRow r in rows)

但这并不难想象中的代码,这将是非常有用的声明 rows 作为 IEnumerable<DataRow> 代码,那里有很多不同种类的对象是正在查询,这是不可行的把查询的宣言》下一个迭代的,它将是有益的,可以检查 rows 与智能感知。这是一个什么东西,不是一个怎样的事情。

其他提示

你会得到一个巨大的各种各样的意见,在这一从"使用var无处不在"到"只有使用var与匿名的类型,基本上你有到。" 我喜欢 埃里克利珀特的带上它:

所有代码是一个抽象概念。是什么 代码是"真"做的是 操纵的数据?没有。数字?比特?没有。电压?没有。电子?是的,但 了解代码的水平 电子是一个坏主意!的艺术 编码是搞清楚什么是正确的 抽象度是对的 观众。

在一个高水平的语言有 总是这之间的紧张什么 代码(在语义上的)和如何 代码完成它。维护 程序员需要了解 什么和如何,如果他们要去 要成功做出改变。

整点是,它皇宫 大规模de-强调"如何"和 大规模强调"是什么"。通过 使用的查询理解, 程序员是说到未来 观众"我认为你应该 既不知道也不在乎这是怎样的 结果设置正在计算,但是你 应该非常关什么的 语义得到设置。" 他们代码接近的 业务流程正在实施和 从更远的位和电子的 让它去。

隐型人只有一个 小的方式,可以在其弱化 如何和由此强调 什么。这是否是正确的事情 要做到在特定情况下是一个 判呼叫。所以我告诉人们, 如果知识的类型是有关的 与其选择是至关重要的 继续运作方法, 那就不用隐含的打字。明确的打字说"我告诉你 这是怎么运作的一个理由,支付 关注"。隐含的打字说"它 不重要的一点是,这是否 事情是一个列表或 客户[],重要的是,它是 收集的客户。"

我个人不用 倾向 使用它,如果该类型的不合理的显而易见的-我在哪里包括皇宫询问为"相当明显".我不会做 Directory.GetFiles 例如,因为它不是真正明显的是,返回一个 string[] 相反的(说)一个 FileInfo[] (或完全不同的东西)-和,使一个很大的差异为你做什么以后。

如果有一个构造请用右手边的分配操作者,我更有可能去 var:这是公然明显的是什么类型会。这是特别方便的复杂的通用类型,例如 Dictionary<string,List<int>>.

我个人只能使用var在两个地方:

  1. 与匿名的类型,即。皇宫相关(其中var是需要在某些情况下)
  2. 当声明,声明和构造一个特定类型的同类

ie。这是一个示例的第2点:

var names = new List<String>();

编辑:这在应对Jon双向飞碟的问题。

上述答复是在实际上简化。基本上我使用 var 那里的类型是:

  1. 不需要知道的(不多的地方,虽然)
  2. 不可能知道(皇宫的,匿名的类型)
  3. 无知的,或明确从码

在这种情况下的一个工厂的方法,其中所有你需要知道的地方,你写的代码是象你回来是后裔的一些类型, 一些类型 有一个静态工厂的方法,然后我会用 var.是这样的:

var connection = DatabaseConnection.CreateFromConnectionString("...");

上述例子是一个真正的例子,从我的代码。它是清晰的,至少对我和人民,使用这个代码 连接 是DatabaseConnection后裔,但的确切类型是不需要为既不了解代码,也没有使用它。

我试图将"使用var无处不在"的风格...这里是为什么我没有继续使用它。

  1. 退化可读性的时候
  2. 限制Intellisense后=
  3. 输入"var"真的不是短得多的打字"int","string"等, 尤其是智能感知。

与这就是说,我仍然使用它与皇宫.

来自陆地的编程功能,其类型推断规则的天,我的使用 var 为所有当地人在可能的情况。

在Visual Studio,如果你想知道什么类型的任何地方是,所有你需要做的就是悬停在它上面有你的老鼠。

有一些很好的指引在当使用var型接口或目的类型。

我倾向于使用 var 无处不在,但我的同事所说的停止,这是不太可读给我们。所以我现在我用 var 只有在匿名类型、皇宫的查询,并在那里是构造上的右侧。

我觉得很有趣地注意到,这通常是处理在Haskell.感谢 咖喱-霍华德同构, ,(最大)的类型的任何表达Haskell可以推断,而类型的声明是基本上不需要任何地方,有一些例外情况;例如,有时候,你故意想要限制的种类,更具体的东西比将推断。

当然,什么是必要和什么样的建议是不同的事情;在实践中,《公约》似乎是顶级的定义总是有种类型的声明,而本地化定义具有类型的声明。这似乎取得良好的平衡之间的明确性为的可读性的定义作为一个整体,对比简洁-对-可读性地的"助手"或"临时"的定义。如果我理解正确的话,你不能使用 var 对"顶级"定义的(如一的方法或全球职能)在第一位,因此我猜这意味着"使用 var 到处都可以"在C#世界。当然,打字"int"是相同数目的按键作"var",但是大多数实例将超过这些。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top