Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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# 什么';var关键字的意义是什么?_C#_Variables_Boo - Fatal编程技术网

C# 什么';var关键字的意义是什么?

C# 什么';var关键字的意义是什么?,c#,variables,boo,C#,Variables,Boo,关键字消除了显式类型声明的需要,我感兴趣地阅读了它的合适时间 我也读过(但没有用过)这本书,它似乎把事情推进了一步。使用Boo,类型和声明都可以隐含 这让我想知道,为什么C语言设计人员要费心包括一个var关键字 更新:是的,var支持匿名类型,但匿名类型本身不需要var关键字 var anon = new { Name = "Terry", Age = 34 }; 对 anon = new { Name = "Terry", Age = 34 }; 我相信var(以及其他几个新关键字)是专门

关键字消除了显式类型声明的需要,我感兴趣地阅读了它的合适时间

我也读过(但没有用过)这本书,它似乎把事情推进了一步。使用Boo,类型和声明都可以隐含

这让我想知道,为什么C语言设计人员要费心包括一个var关键字

更新:是的,var支持匿名类型,但匿名类型本身不需要var关键字

var anon = new { Name = "Terry", Age = 34 };

anon = new { Name = "Terry", Age = 34 };
我相信var(以及其他几个新关键字)是专门为支持Linq而添加的

var是用于创建匿名类型的关键字-请参阅

匿名类型可以在Linq以外的其他地方使用


var对于Linq非常有用。事实上,根据一位专家作者的说法,“

用于支持LINQ的匿名类型


如果没有var关键字,当您实际打算使用一个已经存在的变量时,可能会意外地创建一个新变量。e、 g

name = "fred";
   ...
Name = "barney"; // whoops! we meant to reuse name

这有点主观,但我认为设计C#3.0使隐式类型变量使用“var”关键字而不是no关键字会使代码更具可读性。例如,下面的第一个代码块比第二个代码块更可读:

在声明变量时很明显:

var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;
myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;
声明变量的位置不明显:

var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;
myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

这些都是过于简单化的例子。我想你能看到这是怎么回事。在复杂的情况下,能够找到变量的实际定义位置可能会更好。

更新:这里有两个相关的问题,实际上: 1.为什么我必须声明变量呢? 2.在让您声明变量的语言中,“var”有什么用途

(1)的答案很多,可以在其他地方找到。我对第(2)项的答复如下:

正如其他评论者所说,LINQ将其用于匿名类型。然而,LINQ实际上是一个更一般问题的实例,其中表达式右侧的类型要么程序员不知道,要么非常冗长。考虑:

SomeGeneric<VeryLongTypename<NestedTypename>> thing = new   
SomeGeneric<VeryLongTypename<NestedTypename>>();
SomeGeneric thing=new
SomeGeneric();
冗长且容易出错,对吗?现在他们让你这么做:

var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();
var thing=newsomegeneric();

通过减少信息重复,可以消除错误。请注意,这里不仅仅存在键入错误:左侧表达式的类型可能会被错误键入,编译器可以从左到右静默地强制转换,但强制转换实际上会丢失右值的某些属性。当右值返回的类型可能未知或匿名时,这一点更为重要。

免责声明:我的示例是Java,因为我知道这一点,但概念应该相同

我投票选出了我认为至关重要的答案(意外地创建一个新变量太容易了)

比尔的价值是多少

尽管如此,我发现有时打字有点令人恼火:

DataOutputStream ds=new DataOutputStream();
看起来是多余的,但老实说,这并没有什么问题。您不必再花太多时间键入两次,而且非常有帮助。需要时间的是当您有问题时——当您不确定如何使用某些API时。如果键入两次类型声明确实让您感到困扰,那么您为什么要在这里浪费时间呢?既然你开始阅读这篇文章,你可以输入30或40条声明,足够你在接下来的两周内所需要的每一条声明

我想我是说,虽然我理解重复自己会造成情绪压力,但一致性、清晰性和制作更智能工具的能力使它非常值得

还有一件事,大多数时候代码不应该像上面的示例那样。你应该做的是:

DataOutput ds=new DataOutputStream();

这会立即隐藏在模板中使用具体类的事实。该模板应该能够在类上执行所需的所有操作。稍后,如果您想用其他类型的输出流替换ds,只需更改这一行即可解决问题。如果您通过强制转换到DataOutputStream来使用DataOutput不可用的功能,编辑器将很容易找到并让您知道。

在您的问题中,
var
通过告诉编译器
anon
这个词现在可以合法地用于任何您希望看到赋值中隐含类型的项的地方,从而为代码增加价值。要求向编译器引入这样的名称,允许编译器拒绝未明确告知允许的内容,从而在编译时捕获某些类型的错误,这样它们就不会在运行时爆发

例如,在问题的更新部分,您询问了以下代码段:

anon = new { Name = "Terry", Age = 34 };
采用这种方式的问题在于,它会将任何赋值左侧以前不存在名称的内容转换为变量声明,即使它实际上是一个输入错误。如果稍后在程序中为anon赋值,然后进一步引用新值,但中间的语句有一个输入错误,则会出现一个直到运行时才会出现的问题


你的回答是Boo做的,所以它必须是好的,或者至少是可能的。但这是一个骗局。我们说的是C,不是Boo。C#的目的之一是使编译器能够捕获尽可能多的错误。Boo也想这样做,但它也希望更像Python。因此,它牺牲了C#的一些(不是全部)编译时安全性,以换取类似python的语法。

我理解var的必要性,并且它非常适合这个目的。没有关键字,只是动态定义变量而没有类型,这很可怕。你伤害了下一个必须维护你的代码或你自己的人
// WTF is var without really knowing what GetData() returns?
// Now the var shortcut is making me look somewhere else when this should
// just be readable!
var myVar = GetData();

// If the developer would have just done it explicitly it would actually
// be easily readable.
SomeObject myVar = GetData();
var weight = GetExactWeightOfTheBrownYakInKilograms();