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】:
在这种情况下,没有区别。因为hello
和world
是string
;
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";有啥区别啊?