将Brevity引入C#/ Java

ric*_*ott 7 c# java oop

背景

目前,如果我想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)

跟进问题:

  1. 这种方法可能存在哪些缺陷.我可以遗漏哪些边缘案例?
  2. 是否有其他方法可以缩短实例化(不使用VB6-esque var)并仍保留含义?

注意:我在这样的功能中看到的主要好处之一是清晰度.让我们说var不受限制.对我来说它没用,它会从右边获得作业,为什么要这么麻烦?对我而言,New()实际上缩短了它的含义.它是一个新的()无论你声明什么,对我来说都是清晰简洁的.

Pet*_*old 33

C#保存在另一端:

var listOfInts = new List<int>();
Run Code Online (Sandbox Code Playgroud)

  • 它不是.NET 3.0.这是C#3.0.在面向.NET 2.0时,您仍然可以使用它.但不,C#2.0中没有等价物. (4认同)

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)

请注意,这保持了基于接口的变量,同时在构造端指定了实现,这很好.


Luc*_*ero 5

通常,在使用面向对象的方法时,您通常会创建比变量更多的更具体类型的实例。此外,使用不太具体的类型或接口通常是个好主意。在这些情况下,这是没有意义的。

考虑接口:

IList<int> = new(); // What instance should the compiler infer?
Run Code Online (Sandbox Code Playgroud)

此外,从技术角度来看,操作的签名不包括其返回类型,因此这种赋值将与正常情况完全不同。


Bri*_*new 5

在新的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)

有关更多信息,请参见此处


sip*_*wiz 3

我同意这将是一个很好的功能。一个更好的例子是需要更多输入的地方:

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)