通过滥用c#中的类型系统,我可以创建代码,编译器将强制执行规则,以确保不执行不可能的操作.在下面的代码中,它特定于矩阵乘法.
显然,下面的内容完全不切实际/错误,但有没有理由我们将来在c#中不能有这样的东西,我可以在其中定义类似Matrix <2,2>的类型并让编译器确保安全性?
此外,在任何主流语言中都存在这样的事情吗?我怀疑C++中的元编程可能会有这样的事情吗?
public abstract class MatrixDimension { }
public class One : MatrixDimension { }
public class Two : MatrixDimension { }
public class Three : MatrixDimension { }
public class Matrix<TRow, TCol>
where TRow : MatrixDimension
where TCol : MatrixDimension
{
// matrix mult. rule. N×M * M×P = N×P
public Matrix<TRow, T_RHSCol> Mult<T_RHSCol>(Matrix<TCol, T_RHSCol> rhs)
where T_RHSCol : MatrixDimension
{ return null;}
}
public class TwoByTwo : Matrix<Two, Two> { }
public void Main()
{
var twoByTwo = new Matrix<Two, Two>();
var oneByTwo = new Matrix<One, Two>();
var twoByThree = new Matrix<Two, Three>();
var threeByTwo = new Matrix<Three, Two>();
var _twoByTwo = new TwoByTwo();
var _2x2 = twoByTwo.Mult(twoByTwo);
var _1x2 = oneByTwo.Mult(twoByTwo);
var _3x3 = twoByThree.Mult(threeByTwo);
var _2x2_ = _twoByTwo.Mult(twoByTwo);
var invalid = twoByThree.Mult(twoByThree); // compile fails, as expected
}
Run Code Online (Sandbox Code Playgroud)
F# 支持语言中内置的度量单位- 基本上是在 CLR 类型之上创建更丰富的类型系统,就像您开始使用泛型所做的那样。
构建更丰富的类型系统(我在自己的软件中使用该系统以确保核心模块的高可靠性和正确性)的一种不同的(我认为是互补的)方法是结合使用编译器和定理证明器来保证满足方法和属性(以及类不变量)的前置条件和后置条件。
这在SPARKDa和Java(通过 JML 扩展)等主流语言中是众所周知的- 并且它也适用于 C#,这要归功于 Microsoft Research 在代码契约功能方面的工作。(我正在大量使用它。我强烈建议观看 MSR 页面上链接的视频,它们是开始使用这些工具的最佳方式。)
MSR 的cccheck静态检查器可以在 Visual Studio 后台运行,并会在代码编辑器中为您提供错误和信息消息以及(我认为是紫色的)波浪线。
如果您想沿着这条路走下去,请查看代码契约 MSDN 论坛以获取支持 - 这似乎是大多数用户常去的地方。
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |