我有一个类,我需要为遗留代码保留一个成员,我需要将其标记为过时,以便新代码不会使用它(不会收到警告)。
让我们说这堂课看起来像这样:
class MyClass
{
[Obsolete]
private string _old = "...";
[Obsolete]
public string Old
{
get { return _old; }
}
}
我声明成员字段_old
已过时,以确保类中的新代码不使用该字段。
我还声明属性Old
已过时,以确保类之外的代码不使用该属性。
当我编译它时,我在属性getter中收到一条警告,说_old
已经过时了。我认为编译器会默默地忽略它,因为属性本身已经过时了。
我是否遗漏了某些内容,或者我是否需要在他们所使用的任何地方添加#pragma warning disable/restore
过时的成员字段(即使方法/属性本身已标记为过时)?
" 的原因我认为编译器会默默地忽略这个"是因为它似乎对过时的类这样做:
[Obsolete]
public class MyObsoleteClass
{
public string DoSomething()
{
// No warning here, since the class itself is obsolete
return new MyClass().Old;
}
}
正如@Heinzi所回答:这似乎是由于Visual Studio中的一个错误。我已经就连接提交了一份报告:
https://connect.microsoft.com/VisualStudio/feedback/details/1146809
事实证明,Visual Studio中的错误不仅限于从属性访问过时的字段。
从过时的方法访问过时的属性不应该产生警告:
public class Class2
{
[Obsolete]
public string Property { get; set; }
[Obsolete]
public void Method()
{
this.Property = "value"; // <-- Incorrect warning reported
}
}
也不应该从另一个班级这样做:
public class Class3
{
[Obsolete]
public string Property { get; set; }
}
public class Class4
{
[Obsolete]
public string Method()
{
return new Class3().Property; // <-- Incorrect warning reported
}
}
有趣的是,它适用于以下类,当添加此类时,其他警告(来自Class4
和Class2
)将会神奇地消失。
public class Class5
{
[Obsolete]
public void Method()
{
// No warning reported here, which is good.
// This magically makes the other warnings disappear too!
new Class2().Method();
}
}
答案 0 :(得分:2)
您的代码很好,您对Obsolete
属性应如何工作的理解是正确的:如果您查看&#34;输出&#34;编译后的选项卡,您会注意到编译器不会为您的案例输出警告(但如果从您的案例中删除Obsolete
属性,将输出警告财产,如预期的那样。)
但是,你是对的,Visual Studio有时会在对代码进行任意更改后显示警告。这似乎是Visual Studio中的一个错误。如果您仍然可以使用最新版本重现它,我建议您在http://connect.microsoft.com上提交错误报告。
答案 1 :(得分:0)
这将是一个聪明的功能,但我没有在文档中看到它 以这种方式工作的任何迹象。另一方面,我不会在私有成员上使用Obsolate
属性(如果类不是极其庞大),但我会重构它。我是你的情况我会写这个:
class MyClass
{
[Obsolete]
public string Old
{
get; private set;
}
}
然后您只需要将_old
的用法更改为Old
,问题就解决了。