目前,如果我想new用C#或Java 创建一个对象,我输入类似于以下内容的东西:
List<int> listOfInts = new List<int>(); //C#
ArrayList<String> data = new ArrayList<String>(); //Java
C#3.0试图通过实现以下编译器技巧来提高简洁性:
var listofInts = new List<int>();
由于编译器已经知道我想创建一个特定类型的新对象(事实上我实例化它而没有为它指定null引用或指定一个特定的方法来实例化它),为什么我不能这样做以下?
//default constructors with no parameters:
List<int> listOfInts = new(); //c#
ArrayList<String> data = new(); //Java
Run Code Online (Sandbox Code Playgroud)
var)并仍保留含义?注意:我在这样的功能中看到的主要好处之一是清晰度.让我们说var不受限制.对我来说它没用,它会从右边获得作业,为什么要这么麻烦?对我而言,New()实际上缩短了它的含义.它是一个新的()无论你声明什么,对我来说都是清晰简洁的.
Pet*_*old 33
C#保存在另一端:
var listOfInts = new List<int>();
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 16
我可以遗漏哪些边缘案例?
我在1月份的博客上简要讨论了这种可能的C#语法.请参阅该帖子的评论,以获取一些读者对语法优缺点的反馈.
是否有其他方法可以缩短实例化(不使用VB6-esque var)并且仍然保留意义?
可能,是的.
然而,C#中的"var"与VB6中的"变体"完全不同."var"与"对象"的含义不同,也不引入动态类型或鸭子类型.它只是一种语法糖,用于消除右侧类型的冗余陈述.
Jon*_*eet 14
在C#3中,已经存在局部变量的镜像,隐式输入:
var listOfInts = new List<int>();
Run Code Online (Sandbox Code Playgroud)
但这不适用于非局部变量.
在Java中,类型推断会考虑到赋值目标,因此使用静态导入和狡猾的库(如Google Java Collections)可以编写如下代码:
List<Integer> integers = newArrayList();
Run Code Online (Sandbox Code Playgroud)
请注意,这保持了基于接口的变量,同时在构造端指定了实现,这很好.
通常,在使用面向对象的方法时,您通常会创建比变量更多的更具体类型的实例。此外,使用不太具体的类型或接口通常是个好主意。在这些情况下,这是没有意义的。
考虑接口:
IList<int> = new(); // What instance should the compiler infer?
Run Code Online (Sandbox Code Playgroud)
此外,从技术角度来看,操作的签名不包括其返回类型,因此这种赋值将与正常情况完全不同。
在新的Java 7提案中,有一个类型推断提议,它将更容易生活.泛型声明.
例如
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
Run Code Online (Sandbox Code Playgroud)
VS
Map<String, List<String>> anagrams = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参见此处
我同意这将是一个很好的功能。一个更好的例子是需要更多输入的地方:
Dictionary<string, int> myDictionary = new Dictionary<string, int>();
Run Code Online (Sandbox Code Playgroud)
如果可以将其实例化为:
Dictionary<string, int> myDictionary = new();
Run Code Online (Sandbox Code Playgroud)
和:
Dictionary<string, int> myDictionary = { {"a",1}, {"b",2} };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1145 次 |
| 最近记录: |