为什么C#中没有与Ada通用参数相当的?

时间:2010-11-25 17:33:09

标签: c# language-features ada

请注意,我不是在谈论Generic Type 参数。

例如在Ada中,我可以编写一个需要使用值而不是类型进行初始化的包。 e.g。

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 个答案:

答案 0 :(得分:3)

“为什么C#没有功能X”的一般答案围绕着这种功能与成本的优势。好处通常很明显,但成本包括:

  • 语言规范的复杂性增加
  • 使用完整语言的代码复杂性增加
  • 增加教育要求 - 开发人员必须了解更多才能了解他们同事的代码
  • 设计功能的成本
  • 实施功能的成本
  • 测试功能的成本
  • 以后添加更多功能的难度增加 - 因为通常功能会相互影响,通常会以尴尬的方式进行互动

基本上,不应该问为什么不存在特定的特征:应该认为与成本相比,该特征的好处是巨大的。功能必须在语言中占据一席之地,语言设计师已经设置了相当高的标准。 (正如安德斯过去所说,每个功能都以-100的分数开始,并且必须逐步提升。)

答案 1 :(得分:1)

为什么不简单地将大小传递给构造函数并用它初始化数组?

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

我可以通过"泛型参数看到的唯一优势"如果你有一个固定大小的数组,这可以允许更快的访问,但无论如何在C#中都不支持(至少不是非局部变量)。

我知道C ++支持这种模板,模板化远远优于C#或Java中的模板。