代码合约 - 不错,处于边缘,但还没有准备好迎接黄金时段?

2024-07-01

我对 .NET 4 中引入的代码契约着迷(尽管是在 DevLabs 的帮助下)。但一张精美的印刷品让我冷静下来。它是这样说的:

  • 当在线程安全方法中的锁之外调用后置条件时,除了不使用它们之外,当前没有解决该问题的方法。
  • .NET 依赖于二进制重写器,因此使构建速度变慢。
  • 使用代码契约也可能会导致运行时性能下降。
  • 不能用于安全敏感检查,因为可以在运行时通过处理 ContractFailed 事件来规避它们。

对我来说最大的是第一个。我不知道是否有人再编写单线程应用程序。因此,如果代码契约不能支持多线程,我认为它们没有多大用处。或者也许我不应该对此过分强调,因为后置条件用于断言方法本身的内部结构,可以进行单元测试。

顺便说一句,我没有找到任何东西,也没有尝试反汇编我的代码来查看先决条件被注入的位置。我想在一个简单的方法中,当 lock() 首先执行时,在它之后注入检查很简单,但在一个相当复杂的方法中,当锁定发生在中间的某个地方时,这可能是一个问题。或者如果使用了除lock()之外的其他机制。


您似乎将“编写多线程应用程序”与“使每个类都线程安全”混淆了。撇开定义术语“线程安全”的棘手问题 http://blogs.msdn.com/b/ericlippert/archive/2009/10/19/what-is-this-thing-you-call-thread-safe.aspx我建议您的课程中很少有人应该在大多数应用程序中使用锁定。

一般来说,我编写了很多类,它们不尝试显式线程安全,但同样不具有任何线程依赖性。他们假设,如果您要从多个线程使用它们,则一次只能从一个线程执行此操作,并使用适当的内存屏障来确保一个线程中所做的更改在下一个使用它们的任何线程中都可见。

那么有相对的few执行必要协调的类。

现在,代码契约的问题可能会使这几个类变得足够弱,从而使整个想法崩溃......但我不认为一开始就这样。

我对代码合约将面临的问题有些警惕,因为 C# 编译器会做越来越多的工作来重写你的代码...我不知道合约团队是否已经解决了迭代器块的问题,但即使他们已经解决了当 C# 5 推出异步方法时,将不得不再次这样做......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码合约 - 不错,处于边缘,但还没有准备好迎接黄金时段? 的相关文章

  • 分段错误(核心转储)

    当我尝试运行此程序时 出现分段错误 核心转储 它编译完美 但我收到错误 我不知道为什么 我已尝试以所有可能的方式编辑我的代码 但仍然收到此错误 我已经没有主意了 任何帮助都会很棒 谢谢 unsigned short reg NULL int
  • IDeserializationCallback 与 OnDeserializedAttribute

    据我了解 当对象在反序列化后需要执行某些任务时 可以使用 IDeserializationCallback 接口和 OnDeserialized 事件 IDeserializationCallback Serializable public
  • 从包含 n 个元素的向量中随机选择 m 个元素

    我有一个向量包含n元素 我需要选择一个子集m向量中随机出现的元素 不重复 做到这一点最有效的方法是什么 我需要在我的代码中执行此操作数千次 我想到的解决方案是使用rand 生成一个随机数k之间0 and n 然后选择k向量中的第一个元素并将
  • 当找到路由/url 但未找到其背后的资源时返回什么?

    当路由customer 1存在但customer搜索背后的资源 实体不存在时 我应该返回 404 吗 我的意思是路线存在 或者我应该返回一个 204 无内容 因为我找不到客户 结果为空 微软样本 public IHttpActionResu
  • 有效取消引用空指针的规则是什么?

    include
  • 将数据路径数据到树状数据结构

    我有以下数据 root root blue root blue temp root main root main dev root main back root etc init root etc init dev root etc ini
  • 为什么 C# 三元运算符不能与委托一起使用?

    当分支选择函数时 使用三元运算符来选择函数可能是有意义的 但这是不可能的 为什么 public class Demo protected bool branch protected void demo1 protected void dem
  • 泛型类中可空的泛型字段

    我正在尝试做这样的事情 public class MySuperCoolClass
  • “constexpr”有什么用?

    我实在是找不到它有什么用处 我的第一个想法是我可以用它来实现 按合同设计 而不使用如下宏 struct S S constexpr int i S i static assert i lt 9 i must be lt 9 S int i
  • Windows窗体C#通过代码改变用户控件

    我有一个 Windows 窗体 我不想将任何其他 Windows 窗体设置为一个 Windows 窗体和不同的用户控件 如何在用户控件之间进行更改 例如以编程方式隐藏一个用户控件并显示另一个用户控件 private void Btt inf
  • Json.Net 反序列化 JSON 对象,索引为名称 [重复]

    这个问题在这里已经有答案了 我尝试使用 Json NET 从 Web 服务解析 JSON 该 Web 服务返回以下格式的数据 0 ID 193 Title Title 193 Description Description 193 Orde
  • 在 OpenGL 中绘制 2D 纹理 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个绘图函数叫做DrawImage但这确实令人困惑 并且仅适用于特定形式的重塑函数 所以我有两个问题 如何在 Ope
  • 仅仅“抛出”一次捕获有好处吗?

    与一位同事就他将大部分功能包装在 try catch 中的做法进行了 激烈辩论 但 catch 中只有一个 抛出 例如 Private sub foo try Do something catch throw And nothing els
  • 从枚举获取 DescriptionAttribute [重复]

    这个问题在这里已经有答案了 我有一个枚举 用于查找协调字符串值 其中一个枚举中有一个空格 因此我尝试使用描述属性来查找该值 在找到 DescriptionAttribute 后 我在转换回公共类时遇到问题 public class Addr
  • 如何确保 IsInRole 检查不使用缓存的凭据

    我有一个连接到 WCF 服务的 WPF 客户端 我想锁定某些功能 以便只有某些用户可以执行某些操作 WCF 服务在执行服务方法时模拟客户端用户 操作系统是Windows XP 我正在读书这个问题 https stackoverflow co
  • C# 替换 Byte[] 中的字节

    替换字节数组中的某些字节的最佳方法是什么 例如我有bytesFromServer listener Receive ref groupEP 我可以做BitConverter ToString bytesFromServer 将其转换为可读格
  • 通过构建服务器进行 Nuget 恢复“无法找到版本”

    我有一个 VS 解决方案 作为 TeamCity Build 的一部分 我们从私有 NuGet feed myget 和公共 feed nuget org 恢复包 大多数软件包都可以正常恢复 但它会挂在下面的 WebApi 和 Mono S
  • C# / 面向对象设计 - 维护有效的对象状态

    设计类时 维护有效状态的逻辑应该合并在类内部还是类外部 也就是说 属性是否应该在无效状态 即值超出范围等 上引发异常 或者是否应该在构造 修改类的实例时执行此验证 它属于班级 除了类本身 以及它委托的任何助手 之外 没有任何东西应该知道或关
  • “System.Int64”类型的表达式不能用于返回类型“System.Object”

    我正在尝试创建以下形式的表达式 e gt e CreationDate CreationDate属于类型long 但是我希望表达式返回一个object反而 我想用object作为返回类型 因为表达式是在运行时根据查询参数动态构建的 查询参数
  • 如何在 WPF 数据网格中显示相关表中的数据

    我只是在寻找使用 WPF Datagrid Linq 的方法 并且试图找出如何显示数据网格中相关表中的数据 例如我有3张表 客户 id 姓名 产品 id 名称 订单 id 客户 ID 产品 ID 我已经在数据库表中建立了关系 我已将表添加为

随机推荐