gpt4 book ai didi

c# - 如何在 C# 中使用前置/后置条件和不变量实现 Stack 类?

转载 作者:行者123 更新时间:2023-11-30 12:34:12 25 4
gpt4 key购买 nike

有没有人有关于如何/什么是在 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关于它一次。该帖子涵盖了前置条件、后置条件和不变量的最基本内容。

作为概念的总结,你可以这样想:

  • 先决条件是在执行方法之前必须为真 - 客户对您的方法的 promise 。
  • 对于您类(class)的客户而言,不变性必须始终公开为真。
  • 后置条件是方法执行后必须为真的条件——您的方法向客户 promise 的内容。

所以,在我的脑海中,对于堆栈,一个容易想到的东西可能是不变量。如果您使用数组对堆栈建模,您可以在类上声明一个不变量,即数组永远不会设置为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com