过时的含义是什么?

4

我接手了一个包含大量旧代码的项目,其中包括C++和C#,目前在Windows 7上使用VS 2010进行编译。

当我构建我的解决方案时,令人惊讶的是有143个项目成功构建。但是,警告数量还是很多。其中一些警告是关于弃用函数的,数量相当惊人。

warning CS0618: 'System.Runtime.InteropServices.UCOMIMoniker' is obsolete
warning CS0618: 'System.Runtime.InteropServices.UCOMIEnumMoniker' is obsolete
warning CS0618: 'System.Runtime.InteropServices.UCOMIRunningObjectTable' is obsolete
warning CS0618: 'System.Runtime.InteropServices.UCOMIRunningObjectTable' is obsolete
warning CS0618: 'System.Runtime.InteropServices.UCOMIBindCtx' is obsolete
warning CS0618: 'System.IO.Path.InvalidPathChars' is obsolete
warning CS0618: 'System.Configuration.ConfigurationSettings.AppSettings' is obsolete
warning CS0618: 'System.Net.Dns.GetHostByName(string)' is obsolete

这是什么意思?这些函数显然仍然被定义,否则它们将无法编译或会给我一些“未找到”或“未定义”的错误。这些函数的实现是否缺失?这些函数是否仍然像以前一样有效?
我查了几个函数,它们已经过时很长时间了。例如,GetHostByName:
.NET Framework
Supported in: 1.1
Obsolete (compiler warning) in 4.6
Obsolete (compiler warning) in 4.6
Obsolete (compiler warning) in 4.5
Obsolete (compiler warning) in 4.5.1
Obsolete (compiler warning) in 4.5.2
Obsolete (compiler warning) in 4
Obsolete (compiler warning) in 3.5
Obsolete (compiler warning) in 3.5 SP1
Obsolete (compiler warning) in 3.0
Obsolete (compiler warning) in 3.0 SP1
Obsolete (compiler warning) in 3.0 SP2
Obsolete (compiler warning) in 2.0
Obsolete (compiler warning) in 2.0 SP1
Obsolete (compiler warning) in 2.0 SP2

如果我理解得没错,.NET 2.0已经过时了,已经有8-9年了(2006年推出)。为什么没有人修复这些问题?它们需要修复吗?当我研究GetHostByName方法时,我发现它已被GetHostEntry替代。很容易...但是等等,有很多人抱怨新函数的工作方式不同,也许你应该用GetHostAddresses替换它。好吧,麻烦。
考虑到我的解决方案中有超过28,000个文件,我不确定我是否可以随意搞事情。有没有一种方法可以知道过时函数的支持时间有多长?一旦我安装系统,应该期望这些工作吗?在代码调用过时接口(MSDN)的情况下,系统存在什么影响?
我并不想了解如何从自己的系统中删除过时代码,而是了解系统应该如何处理外部系统(例如MSDN)上的过时接口。他们显然没有遵循一个简单的循环,即标记过时、替换和删除旧接口。他们的政策是什么?使用MSDN定义接口的用户应该如何应对过时标记,特别是当过时代码没有用“苹果对苹果”等效函数替换时。

1
我认为https://dev59.com/q3A75IYBdhLWcg3wBkS1已经回答了这个问题的具体部分(尽管是C#特定的),而剩下的“废弃功能的支持时间有多长”真的无法直接回答,因为有很多这样的API,可能有不同的支持寿命。通常情况下,支持几个主要版本是合理的。 - Alexei Levenkov
我的问题的一个基本方面根本没有在那个答案中得到解决。已经过时的函数接口是否继续具有非平凡的实现?也就是说,它们仍然“有效”吗?在发布我的问题之前,我阅读了那个问题并觉得有许多未回答的问题,这对我来说是必须回答的。 - LawfulEvil
1
我期望这样的方法在严格按照文档描述的情况下“可用”,有时始终抛出异常可能是一种选择,但我从未听说过.NET Framework的API出现这种情况,但最终应该会完全消失。 - Alexei Levenkov
3个回答

10

通常,类或方法被标记为过时,因为它们将被弃用在下一个版本中,或者不再是执行某个特定任务的最有效方式。然而,微软通常会保留这些方法以确保向后兼容性。


2

在编程中,“OBSOLETE”一词意味着该程序集/资源/函数/类型已被弃用或过时。换句话说,编译器会提醒您有更好或更新的方法来完成它。例如:PHP的mysql_query()函数。


5
我不会说它“会引起问题”,而更应该说是“现在有更好的方法了”。 - Jon Skeet

0
我同意以上所有答案。除此之外,我建议当编译器抱怨过时的方法时,立即用SDK中提供的替代方法进行替换。如果您不打算将项目升级到较新的.NET框架,则可以在整个生命周期内放心使用此警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接