Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#3.0中的var关键字_C#_.net_Visual Studio 2008_C# 3.0_Var - Fatal编程技术网

C#3.0中的var关键字

C#3.0中的var关键字,c#,.net,visual-studio-2008,c#-3.0,var,C#,.net,Visual Studio 2008,C# 3.0,Var,可能重复: 各位好, 我想确认我的理解是否正确。如果我不使用LINQ,那么使用var的唯一好处就是简洁?这是正确的理解吗?不,您可以使用var来构造,无论您是否使用LINQ: var anon = new { Name = "Anonymous", Age = 42 }; 使用这样的类型也更容易。当您有很长的泛型类型时,类型名可能会妨碍在声明中直观地标识变量名 Dictionary<string, Dictionary<int, ICollection<object>

可能重复:

各位好,


我想确认我的理解是否正确。如果我不使用LINQ,那么使用var的唯一好处就是简洁?这是正确的理解吗?

不,您可以使用
var
来构造,无论您是否使用LINQ:

var anon = new { Name = "Anonymous", Age = 42 };

使用这样的类型也更容易。当您有很长的泛型类型时,类型名可能会妨碍在声明中直观地标识变量名

Dictionary<string, Dictionary<int, ICollection<object>>>
字典
特别是如果你回去把它改成

Dictionary<string, IDictionary<int, ICollection<object>>>
字典

我相信在处理通过Web服务等获取的数据时,WCF(Windows communication Foundation)中也会用到它。

如果不使用LINQ,var允许您只声明一次变量的类型,而不是两次

范例

var myObject = new MyObject();
var myAnon = new { Name = "Something", Count = 45 };
vs

这只能在本地完成,并且对于声明匿名类型也很有用

范例

var myObject = new MyObject();
var myAnon = new { Name = "Something", Count = 45 };

差不多,是的<代码>变量可用于任何编译器可以从您分配给它的任何值推断变量类型的地方。(但是,类型推断规则非常复杂,因此您可能需要阅读C#规范以获得全面理解。)

定义匿名类型需要
var
关键字,这一点并不十分正确。例如:

var foo = new { abc = 1, def = 2 };
当然,它既可以在LINQ查询外部使用,也可以在内部使用。

来自msdn:

从Visual C#3.0开始,变量 在方法作用域中声明的 具有隐式类型变量 隐式类型局部变量为 强类型,就像您 您自己声明了类型,但是 编译器确定类型。这个 以下是我的两项声明: 功能等效:


除了LINQ查询,我在使用var关键字时会非常谨慎。当您只需要一个匿名类型时,有一些特定的实例,但我认为这是很少的。Var可能会导致非常混乱的代码,因为除非您使用intellisense拐杖,否则在阅读代码时您不知道要处理的类型

我越来越担心看到这么多的代码片段和代码片段会执行以下操作。。。它是懒惰的,不是var关键字的目的:

// Not too bad but still shouldn't be done because the only gain you have is keystrokes
var Something = new SomeObject();

// Type here is not obvious, are you getting an int, double, custom object back???
var Something = GetLengthOfSpaghettiCode();
所以用它来做LINQ。。。将它用于匿名类型(如果您确实在LINQ之外使用匿名类型,那么您应该仔细检查为什么需要这样做)

引用(文章最后一行)有关var使用的内容:

然而,var的使用至少有可能让其他开发人员更难理解您的代码。因此,C#文档通常仅在需要时使用var


不要把它作为节省击键的捷径,下一个看你的代码的人会很感激的。

我还发现,在低耦合设计中,使用var还可以简化重构。这是因为我们倾向于使用强类型变量,但通常情况下,后面的代码期望使用较弱的类型。使用var,您将抵消对编译器的类型更改

我认为使用var不应该是一个问题,而且我更喜欢它,原因正是代码可读性。首先,var只是一种语法糖,当发出IL时,它会被编译成一个合适的类型。就代码可读性而言,关注变量的用途和赋值方式比关注其类型更有意义。不管怎样,VS.NET编辑器都会在它后面的一行中显示该类型-如果您只是将鼠标悬停在它上面的话。所以这根本不应该是个问题。就调试而言,如果您看到Autos/Local/Watch窗口,它们将显示所有成员的类型

看到这样的代码对我来说更有意义:

var customers = GetCustomerList();
foreach (var customer in customers)
{
  customer.ProcessOrders();
}
相对于

List<CustomerObjectDeserializedFromWebService> customers = GetCustomers();
foreach (CustomerObjectDeserializedFromWebService customer in customers)
{
  customer.ProcessOrders();
}

这不好,;当文本适用于多种类型时,您需要知道文本的默认类型,从而了解x类型的推断。是的,无论如何,我会避免这样的声明。

我们需要Jon Skeet回答这个问题!:)不管怎样,请看这篇帖子:@George-只是出于兴趣,你有没有尝试在这个网站上搜索以前的许多相同问题?有时我想知道搜索是否完全中断了,或者什么的。你可以用MyType=Dictionary用
来修复它但不是当它是来自可见方法的返回类型时。您必须在所有使用它的文件中保持
using
语句的一致性;还是已经修好了?@C罗杰斯。是的,它是一个真正的类型。@C罗杰斯-嗯,匿名类型的属性是只读的。代码完成和IDE足以帮助开发人员在以后查看您的代码(不是拐杖,不是懒惰——只是专业人员)。此外,好的变量名揭示了代码的意图。var关键字很好,特别是在本响应中给出的第一个示例中,因为您将从事好事情:DRY(不要重复您自己)。第二个例子甚至更好,因为进一步删除了抽象。至于var的预期用途,我希望看到引文。第二个例子正是它不好的原因。假设函数返回int,然后函数的代码更改为返回double。您的应用程序仍然可以很好地编译,但会产生完全不符合预期的结果。我认为这就是为什么单元测试和验证是良好实践的原因。如果意图足够重要,因为它与所讨论的类型相关,那么应该对其进行单元测试和验证。或者,更常见的是,完全可接受的结果。通常,方法的意图和返回类型的含义从其名称就可以明显看出。Kelsey,我只想感谢您的评论。在我看来,使用“var”的开发人员非常懒惰。在调试代码时,没有什么比不得不使用que更让我恼火的了
var x = 20;