- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有人有关于如何/什么是在 C# 中实现 Stack 类的最佳方法的任何示例或想法?我知道已经有一个 Stack 类,但我需要了解如何实际实现 Stack 类。
我还需要有关如何在 C# 中使用契约来指定此类的前置条件、后置条件和不变量的建议。我想我之前在 ASP.NET MVC 体系结构中创建模型时使用过类似的东西,但我不完全确定它是否是同一件事并且以相同的方式工作。 (我对先决条件/后置条件/不变量有点迷茫,如果你还不知道 - 所以请耐心等待。)
我的主要问题 - 有人可以就为 Stack 等类正确使用 Contracts 给我建议
是的,我已经付出了努力:
public interface IStack
{
void Push(Object e);
Object Pop();
Object Top();
void EnsureCapacity();
}
}
public class Stack : IStack
{
private Object[] elements;
private int size = 0;
public Stack()
{
elements = new Object[0];
}
public void Push(Object e)
{
// check if this array capacity has been reached and increase if needed
EnsureCapacity();
elements[size++] = e;
}
public Object Pop()
{
// check if the method call is invalid for the object's current state
if (size == 0) throw new InvalidOperationException("Stack.Pop");
Object result = elements[--size];
elements[size] = null;
return result;
}
public Object Top()
{
// check if the method call is invalid for the object's current state
if (size == 0) throw new InvalidOperationException("Stack.top");
return elements[(size - 1)];
}
private void EnsureCapacity()
{
if (elements.Length == size)
{
Object[] oldElements = elements;
elements = new Object[(2 * size + 1)];
}
}
}
最佳答案
如果您愿意,为了开始使用 Microsoft Code Contracts,我制作了一个 blog post关于它一次。该帖子涵盖了前置条件、后置条件和不变量的最基本内容。
作为概念的总结,你可以这样想:
所以,在我的脑海中,对于堆栈,一个容易想到的东西可能是不变量。如果您使用数组对堆栈建模,您可以在类上声明一个不变量,即数组永远不会设置为 null,例如您将定义不变方法:
[ContractInvariantMethod]
private void ObjectInvariant()
{
Contract.Invariant(elements != null);
}
看起来您已经为 pop 方法设置了先决条件 - 您想说用户有责任确保在执行 pop 时堆栈不为空。因此,在 pop 方法的开头,您将拥有:
Contract.Requires(size > 0);
最后,您可以在 pop 上指定一个后置条件,该大小将始终小于 pop 操作之前的大小(如果您愿意,可以更具体):
Contract.Ensures(Contract.OldValue<int>(size) > size);
祝你好运——契约(Contract)很酷而且很有用。这是一种非常简洁的编码方式。
关于c# - 如何在 C# 中使用前置/后置条件和不变量实现 Stack 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7668225/
我是一名优秀的程序员,十分优秀!