C# 如何编写带有过期日期的代码?

C# 如何编写带有过期日期的代码?,c#,visual-studio,coding-style,C#,Visual Studio,Coding Style,我刚刚有了一个想法,我希望能够使用: 比方说,我必须修复一个bug,我决定写一行难看的代码来修复眼前的问题——但这只是因为我向自己保证,我很快就会找到时间进行适当的重构 我希望能够以某种方式将代码行标记为“Expired in”,并添加一个日期,这样,如果代码在该日期之后某个时间编译,就会出现编译错误/警告,并显示适当的消息 有什么建议吗?必须能够执行-可能使用一些复杂的#IF或visual studio中的一些选项? 我正在使用VS2005-主要用于C 谢谢 [编辑]:哇-没想到这个问题会引起

我刚刚有了一个想法,我希望能够使用:

比方说,我必须修复一个bug,我决定写一行难看的代码来修复眼前的问题——但这只是因为我向自己保证,我很快就会找到时间进行适当的重构

我希望能够以某种方式将代码行标记为“Expired in”,并添加一个日期,这样,如果代码在该日期之后某个时间编译,就会出现编译错误/警告,并显示适当的消息

有什么建议吗?必须能够执行-可能使用一些复杂的#IF或visual studio中的一些选项? 我正在使用VS2005-主要用于C

谢谢

[编辑]:哇-没想到这个问题会引起这么多兴趣:) 谢谢大家的回答,谢谢你们把这场辩论变成了一场有趣的辩论。 我知道很难证明使用这样的东西是合理的——我可能不会使用它——但有时候,当你昨天不得不发布一个版本,而你发现自己在一个补丁补丁上妥协时,你想强迫自己在不久的将来修复它


我选择MartinStettner的建议作为答案,因为它满足了我的需求——在运行时没有错误——只在编译期间发生,不需要为此目的定义新类型——而且它不局限于整个方法的范围。干杯

>嵌入一枚定时炸弹,也许考虑应用一个


与其强迫您或其他人修复可能有点难看但在未来仍能按预期工作的代码,您只需在解决方案范围内进行搜索,并在确定是时候开始并重构真正难看的东西时找到难看的部分。

使用
System.ObsoleteAttribute
属性标记代码,您将得到一个编译器警告,这将困扰您修复代码

[Obsolete("You've an ugly hack here")]
public void MyUglyHack()
{
...
}
或者

在构造函数中编写自己的属性,并向其传递过期日期,如果
DateTime.Now>=expirationDate
,则在构造函数中引发异常


在修复代码之前,编译将失败(或者更有可能增加过期日期,或者更有可能只是删除属性。

而不控制编译器(可能在5.0时间段内使用编译器即服务?),您的代码不会过期。您可以将代码标记为已弃用,或使用Observe属性或类似属性发出警告,但人们可以忽略警告(我遇到的许多开发人员还没有学会警告是错误的规则)


我认为要保护人们不受自己的伤害需要做很多工作。如果将来要保护他们不受自己的伤害,那就更难了。请将代码标记为乱码,并保持这种状态。

好吧,它并不能完全满足您的要求,但您可以使用Debug.Assert()方法调用来提醒您(仅在Debug中)一个好处是它不会无意中影响您的生产代码(编译或执行),但在调试过程中会非常烦人,您可能会想要更正它

// Alert the developer after 01/07/2011
Debug.Assert(Date.Now < new DateTime(2011, 7, 1))
//2011年7月1日后通知开发者
Assert(Date.Now
时间和日期都会发出字符串,据我所知,在预处理阶段无法解析它们


有几种方法可以在代码中轻松实现,以确保代码至少在运行时发出警告。包括assert是一种方法,放入代码注释也可以,但我处理它的方式是包含一个doxygen注释,并附上注释,说明函数包含需要解决的黑客、bug或性能问题ed.这最终会被许多程序员过滤掉,很容易在网站上看到,供我或其他人修改。

你可以在表单中写评论行

// Expires on 2011/07/01
并添加一个预构建步骤,该步骤在解决方案范围内用以下内容替换这些行

#error Code expired on 2011/07/01
对于包含当前日期之前的日期的所有行。对于此预构建步骤,您需要编写一个简短的程序(可能使用正则表达式和一些日期比较逻辑)


这一步也可以由VS宏执行,它允许更容易地访问解决方案的所有文件,但缺点是它必须安装并在编译项目的所有VS安装上运行。

如果您对代码进行了单元测试,那么您可以对验证修复的测试进行定时轰炸不要在生产代码中引入奇怪的检查


此外,我认为,如果你必须加入hack(你可能已经花了足够的时间来研究它以正确修复…但仍然希望在那里进行hack),那么最好的选择是打开bug/创建任务/工作项(无论你使用什么来跟踪未来的工作)然后决定是否要稍后修复它。

我认为这就是Visual Studio有任务列表的原因。添加注释:

\\ TODO: Fix this spaghetti by 01APR11
它会像这样出现

关键字可从选项中配置


ooohohh-这是“不可能的。试着笑一下:

[AttributeUsage(AttributeTargets.All)]
public class BugExpiryAttribute : System.Attribute
{
    // don't tell 'anyone' about this hack attribute!!
    public BugExpiryAttribute(string bugAuthor, string expiryDate)
    {
        DateTime convertedDate = DateTime.Parse(expiryDate);
        Debug.Assert(DateTime.Now <= convertedDate, 
            string.Format("{0} promised to remove this by {1}", 
                bugAuthor, convertedDate.ToString("dd-MMM-yyyy")));
    }
}
…讨厌的:-)

[免责声明]-以学术利益的名义创建,而不是以生产代码finese的名义创建

[编辑]-只是澄清一下,编译和生产中的代码将在“bugExpriryDate”当天/之后继续运行。只有在编译器中运行代码后(日期当天/之后),才会发出警告消息(debug.assert)。只是觉得值得做出这样的区分——马丁斯特纳干杯


[caveat]-如果在类/方法等中使用,则需要通过反射读取。但是(这很有趣)如果在
sub Main()
上使用,将直接在编译器中工作。真奇怪!!(谢谢你的点名…

改为在bug中跟踪它。然后它可以与其他重构工作一起被适当地安排和优先排序

TODO
代码中的注释可能有一个趋势
[BugExpiryAttribute("Jack Skit", "2011-01-01")]
public static void Main(string[] args)
{
...
}
private void expired()
{
DateTime expired = DateTime.Parse(Convert.ToDateTime(datetimepicker1.Text).ToString());
DateTime compare = DateTime.Parse(Convert.ToDateTime(datetimepicker2.Text).ToString());

if(expired < compare)
{
MessageBox.Show("This product is expired!");
}
else
}
MessageBox.Show("This product is not expired");
{
}