【问题标题】:When should I use var and when should I use string, ulong, int, etc [duplicate]什么时候应该使用 var,什么时候应该使用 string、ulong、int 等 [重复]
【发布时间】:2019-04-13 14:51:45
【问题描述】:

什么是“正确”的使用方式

var x = "text";

string x = "text";

我使用哪个重要吗?人们通常这样做是否有“标准”方式?我只是问,因为有时 Rider 建议我使用var

【问题讨论】:

  • 它不影响编译时间。真的,只要你觉得舒服就用它。它还使代码看起来更干净。例如,如果我有一个Dictionary<CustomClass<int>, boolean> dictionary,我不想每次都显式地键入它。

标签: c# .net


【解决方案1】:

在某些情况下您必须使用显式类型,而在某些情况下您必须使用var

必须使用显式类型:

如果您声明一个变量而不初始化它,或者如果您想将一个变量显式初始化为null

 string myString;
 int i;
 string someString=null;
 DateTime? nullableDate=null;

必须使用var:

当您使用匿名类型或具有一个或多个匿名类型的类型参数的泛型类型时。

var stuff = new {Name="Bob", Age=25};
var bunchOfStuff = from item in items select new {item.Name, item.Age};

否则

这是风格和/或品味的问题

【讨论】:

  • 另一个必须使用var 的方法是在反射中处理非公共类时,因此不能直接引用或强制转换为已知类型。
  • @Jimi:是的,但是...反射是一个基于object 的API。你可以说var myList=Activator.CreateInstance(typeofAListofAnonymousTypes);,但myList 的静态类型只是object。除非您先将其转换为 IList,否则编译器不会让您在其上调用 Add。是的,我通常将 var 与 Reflection 一起使用,但我也将它与字符串一起使用。
  • 不是我的意思:使用ExtractSslProtocol snippet from here 并尝试在不使用var 提供的类型推断的情况下解决它。这些不是object 类型,也不是匿名类型。
  • 我在该示例中看到的var 的所有用法都声明了reference to object 类型的变量。它们引用的对象具有完整类型(就像我的 Activator.CreateInstance 示例一样),但据编译器所知,它们是 objectvar 的酷之处不在于它可以声明一个可以是任何类型的变量(objectdynamic 就足够了),而是编译器可以推断类型并正确键入 变量.
  • 这些类型都不是object。它们是无法转换为 .Net 类的私有/内部类和引用类的属性。
【解决方案2】:

var主要是语法糖,但有时您必须使用var,这时您将变量分配给匿名类型.

匿名类型示例:

var anonymousType = new { Name = "Mathew", DOB = DateTime.Now };
Console.WriteLine($"{anonymousType.Name} : {anonymousType.DOB}");

至于何时使用它......这是一个意见和/或团队指南。无论哪种方式,都没有任何收获或损失。 那就是说;这是我的意见.. 这个问题会被搁置太宽泛,但与此同时,无论您选择什么,这里都有一些东西可以看。

我喜欢var,但我相信如果你不小心如何命名/使用变量,这可能会让人感到困惑,但是……我个人更喜欢var。它更短,可以清理代码或使其更短一些。特别是当你有像Person person = new Person(); 这样的东西时,我的 Person 实在太多了......我也喜欢 var 如何在某种程度上模仿 JavaScript 的语法(尽管这两个声明是不同的)。

var 与正确声明类型没有什么不同,因此在您的问题string xvar x 中没关系。编译器会推断出分配的类型,这就是 var 变成的类型。

我确实推荐这个...当您声明任何变量时,尤其是那些使用var 的变量时,我总是将声明命名为尽可能接近类型,这样您选择哪个都没有关系。正确命名变量,无论哪种方式都没有人会给您带来困难……再说一次;这都是意见。

var person1 = new Person();
Person person2 = new Person();

var employee1 = new Employee();
Employee employee2 = new Employee();

var employee3 = new Employee();
Person person3 = new Employee();    

person1.Name = "Mathew";
person2.Name = "Mark";

employee1.Name = "Luke";
employee2.Name = "John";
employee3.Name = "Acts";

person3.Name = "Romans";

【讨论】:

    【解决方案3】:

    documentation for var 说:

    隐式类型的局部变量是强类型的,就像你自己声明了类型一样,但编译器决定了类型。

    最后,在功能上没有区别。因此,要回答您的问题,不,您使用哪一个并不重要。正是出于这个原因,没有“标准”或“适当”的可以使用。

    使用你喜欢的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2011-04-15
      • 2017-04-10
      • 2012-03-19
      • 2018-05-12
      • 2018-12-11
      • 1970-01-01
      相关资源
      最近更新 更多