维护 .NET 框架和项目之间的合同

Posted

技术标签:

【中文标题】维护 .NET 框架和项目之间的合同【英文标题】:Maintaining contract between .NET framework and project 【发布时间】:2014-08-04 13:36:52 【问题描述】:

我有一个非通用包装器,它可以容纳一个受支持对象的实例。支持的类型之一是DateTime。在内部,包装器使用原始值的选择来存储值,因此DateTime 类型的实例不能立即使用,需要一个简单的表示。可以使用属性DateTime.Ticks,它返回一个Int64 的实例(由于某种原因,longInt64DateTime.cs 中不小心互换了)。

如果DateTime.Ticks 的返回类型发生变化,不会抛出异常,对象将照常使用,这是一场灾难。常识告诉我它不会改变,但我觉得依靠这样的想法是不负责任的。现在我已经在负责执行 DateTime 的演员的代码上留下了评论,我错过了更好的选择吗?

【问题讨论】:

如果合同发生变化,想到的解决方案会在 JIT 时间导致构建失败或运行时异常。这就是你所追求的吗? DateTime.Ticks 属性的类型不会改变:这样的重大改变可能会破坏许多现有的应用程序。但您也应该知道 DateTime.Ticks 不足以持久化任意 DateTime 值:您还需要持久化 Kind 属性(Local、Utc 或 Unspecified)。 @cynic - 是的,Visual Studio 有这方面的功能吗? @Joe - 是的,我知道,DateTime 值首先转换为通用时间。 【参考方案1】:

在将框架类属性的值分配给支持原始类型字段时,您可以使用通用辅助方法。

在框架组装中:

public class FrameworkClass

    public long Ticks;

在您的程序集中:

class Program

    static void Main(string[] args)
    
        var fc = new FrameworkClass()  Ticks = 2 ;
        long backingField;
        Assign(out backingField, fc.Ticks);
        Console.Error.WriteLine(backingField);
    

    static void Assign<T, U>(out T left, U right) where U : T
    
        left = right;
    

如果框架程序集发生变化,Ticks 字段不再是 long,您的代码将不会针对新框架编译,并且如果您尝试运行针对“旧”框架编译的程序集, “新”框架,您将获得 MissingFieldException - 不会发生任何分配。

【讨论】:

以上是关于维护 .NET 框架和项目之间的合同的主要内容,如果未能解决你的问题,请参考以下文章

七步法与甲方工程项目管理之看合同篇

2016年3月28日作业 沟通和合同管理

2016年3月28日作业 沟通和合同管理

跪求合同翻译成英文!

新元科技与世星科技签订5.8亿元分布式存储中心项目合同

第7章 "敏捷+"项目管理