代码之家  ›  专栏  ›  技术社区  ›  moogs

有人发现“var”的用法不是用于linq吗?

  •  10
  • moogs  · 技术社区  · 15 年前

    只是好奇而已。我大概99.999%确定没有……但是有什么?

    编辑:这些都是不错的答案(为“可读性”节省了输入时间或使代码不那么冗长)。我想我应该澄清我所说的“使用”是什么意思——一些没有“var”就无法完成的构造/设计。

    11 回复  |  直到 13 年前
        1
  •  24
  •   Darko    15 年前

    在可读性方面有什么更好的?

    AReallyReallyLongBusinessObjectName obj = new AReallyReallyLongBusinessObjectName();
    

    var obj = new AReallyReallyLongBusinessObjectName();
    

    我说的是可读性,因为使用var对您的应用程序绝对没有影响,因为这两个语句在编译时生成相同的il。

    对编辑的响应: 没有什么要求您使用var(除anon类型之外)——它只是语法上的糖分。

        2
  •  16
  •   Scott Dorman    15 年前

    我用它 foreach 循环非常频繁:

    foreach(var item in collection)
    
        3
  •  9
  •   Andrew Hare    15 年前

    var 对于匿名类型最有用(没有匿名类型就无法创建)。我也看到过其他人使用它通过类型推断来减少类型和冗余类型信息。

    我个人发现,当它被用来减少输入时,它会损害可读性——记住,你花1%的时间编写代码,99%的时间阅读代码。

    // the compiler may be able to infer the type
    // of "foo" but I certainly cannot without 
    // viewing the implementation of "doSomething".
    var foo = doSomething();
    

    编辑: 要记住的主要事情(这对于所有编码样式的事情都是常见的)是,您需要选择一种样式并始终如一地使用它。只要你喜欢它,并且有理由使用它,你觉得它是健全的,那么你就赢得了战斗:)

        4
  •  3
  •   Graviton    15 年前

    我使用 var 一直以来-- 尤其是类名很长的时候 .

    它不会给我带来问题,因为我的方法通常是以这样的方式命名的,只要看一眼名称,我就可以推断出类型。

    如果我不能,我会用VS2008智能感知来帮助我,或者我只是用 Resharper var=>类名转换器,将其转换为显式名称。

    另一个案例我发现 变量 在A中 foreach 循环:

    foreach(var id in idList)
    {
      // do what you will here
    }
    
        5
  •  3
  •   mezoid    15 年前

    匿名类怎么样?

    var mySomething = new { Name = "Hello", Age=12 };
    
        6
  •  1
  •   Prashant Cholachagudda    15 年前

    是的,我在为长名称和中的类创建对象时一直使用它。 foreach

    编辑: 我不认为var可以在设计或任何构造中发挥主要作用…因为它只能在本地使用,即在方法或范围内。

    VaR的另一个主要限制是不能将其用作 方法参数 作为返回类型 . 您甚至不能在类中将其声明为字段。这意味着我们可以使用var来节省输入时间,或者减少代码对于“可读性”和LINQ的冗长性。

        7
  •  1
  •   STW    15 年前

    我发现它在原型设计中非常有价值,它让我能够快速存储函数/属性的结果,并且使我能够调整这些函数的返回类型,之后清理更少。它有点像方法的接口,它让我不用担心具体的返回类型,而更多地担心方法的意图。

    正如其他人提到的,在初始化对象的新实例时使用它也是很好的;具有 Foo foo = new Foo(); 是多余的。 var foo = new Foo(); 同样可读,如果有多个声明的话更好…

    var connString = BuildConnectionString();
    var sqlConn = new SqlConnection(connString);
    var commandText = BuildCommandText();
    var sqlComm = new SqlCommand(commandText, sqlConn);
    

    VS

    string connString = BuildConnectionString();
    SqlConnection sqlConn = new SqlConnection(connString);
    string commandText = BuildCommandText();
    SqlCommand sqlComm = new SqlCommand(commandText, sqlConn);
    
        8
  •  1
  •   Jan Jongboom    15 年前

    当使用MVC并让客户机控制器返回所有Ajax请求时,您几乎总是使用var,因为对于匿名类型,您只能将应用程序所需的数据发送回客户机。

    var response = new { var1 = "bla", var2 = "foo" };
    return JSon(response);
    
        9
  •  1
  •   Travis Heseman    15 年前

    我几乎每次给局部变量赋值都使用var。这确实限制了在特定方法的返回类型发生更改时必须进行的代码更改量。例如,如果我有以下方法:

    List<T> GetList()
    {
        return myList;
    }
    

    我可以让各地的代码行执行本地变量赋值,如下所示:

    List<T> list = GetList(); 
    

    如果更改getList()以返回ilist<t>,则必须更改所有这些分配行。n行赋值等于n+1如果我更改返回类型,代码将更改。

    IList<T> GetList()
    {
        return myList;
    }
    

    相反,如果我的代码如下:

    var list = GetList(); 
    

    然后我只需要更改getList(),其余的将通过编译进行验证。我们只更改了一个代码就开始运行。当然,如果存在依赖于列表的代码,而不是IList,编译器会抱怨,但这些代码应该少于n。

        10
  •  1
  •   Av Pinzur FryGuy    13 年前

    我最喜欢的非LINQ用法是与 foreach . 指定类型将明确指示编译器在必要时执行强制转换(这可能导致运行时错误),同时只使用 var 这是一个简单的方法来确保我真正拥有我认为我拥有的项目类型。

        11
  •  0
  •   luvieere    15 年前

    我在某个地方读到,它建议您在调用不是由您编写的模块中的代码的情况下使用“var”,并且返回的对象的类型将受到未来更改的影响。如果要将包装器写入该外部模块,并且只转发结果,那么使用var临时存储结果会使代码在外部调用返回的数据类型更改时仍然有效。另外,如果您知道这个结果是某种类型的集合,但同样地,不是特别稳定的类型,那么分配给var,然后在进一步更改的情况下迭代仍然可以工作。