new[] 和 new string[] 有啥区别? [复制]

Posted

技术标签:

【中文标题】new[] 和 new string[] 有啥区别? [复制]【英文标题】: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 这个问题的一个变体。 我认为变体与重复并不相同,尤其是当一个问题询问语法的含义而一个问题询问两种语法(语法?)之间的区别时,但它只是一个小问题。反正已经回答了。 【参考方案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  ;

【讨论】:

知道是哪个版本的 C# 引入了这个吗? 它是在 C# 3.0 中引入的:msdn.microsoft.com/en-us/library/… @CalebJares: 详细说明...【参考方案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,其中类型是从元素中推断出来的。而另一种方法创建一个字符串数组。

【讨论】:

是的,我表达错了,它不是一个对象数组,它只是从它初始化的元素中推断出类型 嗯,那是完全不同的东西。

以上是关于new[] 和 new string[] 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java中定义一个字符串 String st1="student";和String st1=new String("student"); 有啥区别啊?

Java 中String s="你好" 跟 String s=new String("你好")有啥区别

JAVA中String s = "hello"和String s = new String("hello")有啥区别啊?

JAVA里面 String a = "aaa"; 和 String a = new String("aaa");有啥区别?

JavaScript 中 Date() 和New Date()有啥区别?

java 定义字符串 String a=new String("aaabbb");和String a="aaabbb";有啥区别啊?