Представляем краткость в C # / Java - PullRequest
7 голосов
/ 08 апреля 2009

Фон

В настоящее время, если я хочу создать 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

Последующие вопросы:

  1. Каковы возможные подводные камни этого подхода. Какие крайние случаи я мог пропустить?
  2. Существуют ли другие способы сократить время создания экземпляров (без использования VB6-esque var) и при этом сохранить значение?

ПРИМЕЧАНИЕ. Одним из основных преимуществ, которые я вижу в такой функции, является ясность. Пусть скажем, вар не был ограничен. Для меня это бесполезно, оно собирается получить назначение справа, так зачем беспокоиться? Новый () для меня на самом деле сокращает его и дает смысл. Это новый () то, что вы объявили, что для меня будет ясным и кратким.

Ответы [ 15 ]

33 голосов
/ 08 апреля 2009

C # сохраняет на другом конце:

var listOfInts = new List<int>();
16 голосов
/ 08 апреля 2009

Какие крайние случаи я мог пропустить?

Я кратко обсудил этот возможный синтаксис C # в своем блоге в январе. См. Комментарии к этому посту, чтобы узнать отзывы читателей о плюсах и минусах синтаксиса.

Существуют ли другие способы сократить инстанцирование (без использования VB6-esque var) и при этом сохранить смысл?

Возможно, да.

"var" в C #, однако, не похож на "вариант" в VB6. «var» не означает то же самое, что и «объект», а также не вводит динамическую типизацию или типизированную типизацию. Это просто синтаксический сахар для , устраняющий избыточное указание типа правой стороны .

14 голосов
/ 08 апреля 2009

В C # 3 уже есть зеркальное отображение для локальных переменных, неявно набирая:

var listOfInts = new List<int>();

Это не работает для нелокальных переменных , хотя.

В Java вывод типа учитывает цель назначения, поэтому с помощью статического импорта и хитрых библиотек, таких как Google Java Collections , вы можете написать код, такой как:

List<Integer> integers = newArrayList();

Обратите внимание, что это сохраняет переменную на основе интерфейса при указании реализации на стороне конструкции, что приятно.

5 голосов
/ 08 апреля 2009

В новых предложениях Java 7 есть предложение по выводу типа, которое будет проще. объявления дженериков.

, например

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

против

Map<String, List<String>> anagrams = new HashMap<>();

См. здесь для получения дополнительной информации.

4 голосов
/ 08 апреля 2009

Как правило, при использовании объектно-ориентированных подходов вы часто создаете больше экземпляров более определенного типа, чем ваша переменная. Кроме того, часто рекомендуется использовать менее конкретный тип или интерфейс. В этих случаях это не имеет смысла.

Подумайте об интерфейсах:

IList<int> = new(); // What instance should the compiler infer?

Кроме того, с технической точки зрения сигнатура операции не включает в себя тип возвращаемого значения, так что такой тип назначения будет полностью отличаться от обычного случая.

4 голосов
/ 08 апреля 2009

Ваша версия менее читаема, извините.

Код предназначен для чтения людьми, только случайно на машинах.

2 голосов
/ 08 апреля 2009

Я согласен, что было бы неплохо. Лучшим примером будет, когда требуется еще больше печатать:

Dictionary<string, int> myDictionary = new Dictionary<string, int>();

Жизнь была бы проще, хотя бы немного, если бы ее можно было создать как:

Dictionary<string, int> myDictionary = new();

и

Dictionary<string, int> myDictionary = { {"a",1}, {"b",2} };
2 голосов
/ 08 апреля 2009

C # 3.0 имеет механизм, позволяющий уменьшить дублирование при наборе текста, но это достигается за счет неопределенности в отношении типа, который вы объявляете, но явно в типе, который вы создаете:

, например

var listOfInts = new List<int>();
2 голосов
/ 08 апреля 2009

В C # есть

var listOfInts = new List<int>();
2 голосов
/ 08 апреля 2009

C # имеет:

var listOfInts = new List<int>();

, который достигает того же самого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...