有没有办法在编译时阻止调用一个方法?

7

我有一些类,其中有几个方法我并不想要,但是它们存在只是因为XML序列化器需要它们。是否有办法在用户代码调用它们时生成编译时错误/警告?

我知道我可以实现IXmlSerializable,也知道我可以将这些类分离成纯数据存储类,但我并不是在问如何设计这样的系统,我只是在问是否有一种方法可以在除了XML序列化器之外的任何地方调用它们时生成编译时错误/警告...


还可以参见https://dev59.com/V0fSa4cB1Zd3GeqPBOxK。 - Dirk Vollmar
3个回答

14

你可以添加

[Obsolete]

使用ObsoleteAttribute特性可以标记方法已过时并提供一条解释信息,同时通过该特性的IsError属性控制生成错误或警告。


[已过时],与 OP 所期望的目的不同。我认为这个属性并不是用来这样使用的。 - Pop Catalin
@Pop:当然,目的可能略有不同,但结果很可能正是所要求的。 - Fredrik Mörk
抱歉,还有一个问题 - 是否有任何方法可以应用类似于属性的设置变量器的东西,以便您可以获取值但不能设置它,或者最好的解决方案是定义一个单独的属性,并将整个属性标记为过时? - Matt Whitfield
@Matt:我不确定,恐怕无法回答。建议你试着自己玩一下 :) - Jon Skeet
2
@Matt,ObsoleteAttribute 的目标是:AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate,但不包括事件和属性访问器。答案是否定的,你不能将 ObsoleteAttribute 添加到属性访问器中。 - Pop Catalin

5

你可以使用ObsoleteAttribute来标记需要修改的成员。虽然它的主要目的不同,但当用户代码调用时,它将生成编译器警告(或错误)。


0

您可以使用[EditorBrowsable]属性从用户的智能感知中隐藏方法,并使用[Browsable]属性从属性设计器中隐藏。

我不建议使用[ObsoleteAttribute],因为它传达了与方法状态实际上是什么不同的含义。相反,请使用注释指示不应从用户代码中使用该方法。

还要记住,有很多用户将其代码编译为威胁警告作为错误,这将使他们无法编译有效的代码,在这种情况下。



ObsoleteAttribute传达了稍微不同的含义,但具有所需的行为。我会认为EditorBrowsable实际上也没有“你不应该从用户代码中调用这个”的含义 - 而且在这种情况下它不会生成警告或错误,这是期望的行为。 - Jon Skeet
1
Jon的回答对我来说几乎是完美的,因为我正在重构一些旧代码,而且现在没有时间完全重新设计它,所以如果我能通过编译时错误消除糟糕的对象使用模式,那对我来说是一个巨大的胜利 - 当然不是理想的计算机禅奇妙境界,但仍然是一个巨大的胜利。 - Matt Whitfield
@Matt Whitfield +1 鼓励实用主义 - Sam Holder

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