Почему в C # нет эквивалента универсальным параметрам Ada? - PullRequest
2 голосов
/ 25 ноября 2010

Обратите внимание, что я не говорю о параметрах Тип .

Например, в Ada я могу написать пакет, который должен быть инициализирован с использованием значения вместо типа.например,

generic
  Size : Positive;
package Sudokus is

   subtype Values is Positive range 1..Size*Size;
   type Choice is private;
   type Sudoku is private;

   procedure Fill(S : out Sudoku);
   procedure Init(S : out Sudoku);
   procedure Solve(S : in out Sudoku);
   procedure Print(S : Sudoku);

   Unsolvable_Grid_Error : exception;

И вот как это использовать:

package My_Sudoku is new Sudokus(3); -- 3 for 9x9 solver, 4 for 16x16 solver, etc.

Я думаю, что нет эквивалента, но я считаю его весьма полезным.Есть ли причина этого отсутствия?

Ответы [ 2 ]

3 голосов
/ 25 ноября 2010

Общий ответ на вопрос «почему в C # отсутствует функция X» вращается вокруг преимуществ такой функции по сравнению с затратами.Преимущества, как правило, очевидны, но затраты включают:

  • Увеличена сложность спецификации языка
  • Увеличена сложность кода с использованием языка до полного
  • Увеличена потребность в образовании - разработчикинеобходимо знать больше, чтобы понять код своих коллег
  • Стоимость разработки функции
  • Стоимость реализации функции
  • Стоимость тестирования функции
  • Повышенная сложность добавления дополнительных функций позже - потому что часто функции будут взаимодействовать друг с другом, часто неуклюжими способами

По сути, это не должен быть случай, когда спрашивают, почему не присутствует определенная функцияСтоит утверждать, что преимущества этой функции огромны по сравнению с затратами.Функции должны заслужить свое место в языке, и языковые дизайнеры установили планку довольно высоко.(Как говорил Андерс в прошлом, каждая функция начинается с оценки -100 и должна идти вверх.)

1 голос
/ 25 ноября 2010

Почему бы вам просто не передать размер конструктору и не инициализировать массив с ним?

class Sudokus 
{
  char[] field;
  public Sudokus (int size){ field = new char[size*size]; }
}

Единственное преимущество, которое я мог видеть с «универсальным параметром», - это наличие массива фиксированного размера, который мог бы обеспечить более быстрый доступ, но который в любом случае не поддерживается в C # (по крайней мере, как нелокальная переменная) .

Я знаю, что этот тип шаблонов поддерживается в C ++, который значительно превосходит шаблоны в C # или Java.

...