【问题标题】:What is the difference between new[] and new string[]? [duplicate]new[] 和 new string[] 有什么区别? [复制]
【发布时间】:2012-12-29 18:00:03
【问题描述】:

可能重复:
What is this new[] a shorthand for?

有什么区别

var strings = new string[] { "hello", "world" };

var strings2 = new[] { "hello", "world" };

【问题讨论】:

  • 我完全不同意这种“过于本地化”。虽然这不是一个高级问题,但绝对是很多人都会遇到的问题。 =)
  • 我既不同意投反对票也不同意它“过于本地化”。这是一个有效的问题,许多初级(当然还有一些不那么初级的)开发人员可能不知道这一点。把它放在这里作为未来的参考对很多人来说真的很有帮助。
  • 这是一个很好的问题,但作为副本关闭。我自己 answered 这个问题的一个变体。
  • 我认为变体与重复并不相同,尤其是当一个问题询问语法的含义而一个问题询问两种语法(语法?)之间的区别时,但它只是一个小问题。反正已经回答了。

标签: c# arrays semantics


【解决方案1】:

没有区别。

第二个是称为"Implicitly typed arrays" 的语法糖,两个表达式都返回一个字符串数组。

当你不指定数组的类型时,它是从用于初始化数组的元素的类型推断
要允许推理,表达式必须满足以下条件:

考虑像这样的隐式类型数组表达式:

   var arr = new []{ obj1, ... , objn }

初始化中所有元素类型的集合为:

   S = {T1, ..., Tn}

为了允许推断(即没有编译器错误),所有类型都必须可以 { T1, ... , Tn } 隐式转换为集合中的一种类型 S.

因此,例如,给定以下类:

class Base { }
class Derived1 : Base { }
class Derived2 : Base { }
class Derived3
{ 
    public static implicit operator Base(Derived3 m)
    { return null; }
}

这段代码编译:

var arr = new []{ new Derived1(), new Derived2(), new Derived3(), new Base()};

而以下不是:

var arr = new []{ new Derived1(), new Derived2(), new Derived3() };

因为在第一种情况下,所有 3 种类型都可以隐式转换为类型 Base,并且 Base 类型在集合 S = { Derived1, Derived2, Derived3, Base } 中,而在第二种情况下,所有类型都不能转换为类型集合S = { Derived1, Derived2, Derived3 }


C# 3.0 与匿名类型一起引入了此功能,它使后者的数组的实例化更加容易。

例如,如果没有隐式类型的数组,这将很难获得:

var arrayOfAnonymous = new[] { new { A = 3, B = 4 }, new { A = 2, B = 5 } };

【讨论】:

【解决方案2】:

在这种情况下,没有区别,因为new[] 会将提供的值类型推断为string

Implicitly typed arrays

【讨论】:

  • 完全正确的c#在类型定义上是非常可变的,但是我总是会隐式定义变量类型以避免转换错误,分别直接看到错误,这可能会在转换时出现
  • @Nickolaus:这里没有演员表。该变量仍然是强类型的。
  • @Nickolaus 也没有任何使用 var 关键字的转换,这就是我怀疑你所暗示的。 =)
  • @Nickolaus 无论您是使用var 还是显式声明的类型,都只是品味和所需清晰度的问题,真的。 ^^
  • @Nickolaus 在提到var 时,您不应该真的说动态。 var 实际上是强类型的,不像 C# 的 dynamic
【解决方案3】:

在这种情况下,没有区别。因为helloworldstring

var strings2 = new[] { "hello", "world" };

创建一个与第一个相同的string[] 数组。

第二个就叫Implicitly Typed Arrays

如果我们更进一步,它们具有相同的IL 代码。

【讨论】:

  • 我个人更喜欢 linqpad 进行这种可视化。仍然。很清楚,那个。 =)
  • @J.Steen 我一直更喜欢 Linqpad,但它有调试模式?如果有的话,我想念它很久了=)
  • 啊,不,没有调试模式 - 但我只是 .Dump() 输出所有内容,因为我需要它。 =)
  • 但是这个可视化需要调试模式;)
  • 就个人而言,我发现 linqpad 中结果窗口的简洁输出(例如 new[]{"hi","bye"}.Dump();)令人满意。但是,品味总是非常主观的。 =)
【解决方案4】:

无,编译将其解释为new string[] { "hello", "world" };

就像使用var一样,编译器会处理你的意思。

【讨论】:

    【解决方案5】:

    没有区别。 在第二种情况下,C# 编译器足够聪明地推断出数组的类型,因为它发现用于初始化数组的值是字符串类型的。

    【讨论】:

      【解决方案6】:

      new[] 创建一个implicitly typed array,其中类型是从元素中推断出来的。而另一种方法创建一个字符串数组。

      【讨论】:

      • 是的,我表达错了,它不是一个对象数组,它只是从它初始化的元素中推断出类型
      • 嗯,那是完全不同的东西。
      猜你喜欢
      • 2015-12-07
      • 2014-07-22
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2018-08-02
      • 2022-12-04
      • 2011-11-22
      相关资源
      最近更新 更多