OK, I know what you're thinking, "why write a method you do not want people to use?" Right?
Well, in short, I have a class that needs to be serialized to XML. In order for the XmlSerializer
to do its magic, the class must have a default, empty constructor:
public class MyClass
{
public MyClass()
{
// required for xml serialization
}
}
So, I need to have it, but I don't want people to use it, so is there any attribute that can be use to mark the method as "DO NOT USE"?
I was thinking of using the Obsolete attribute (since this can stop the build), but that just seems kinda "wrong", is there any other way of doing this, or do I need to go ahead and bite the bullet? :)
OK, I have accepted Keith's answer, since I guess in my heart of hearts, I totally agree. This is why I asked the question in the first place, I don't like the notion of having the Obsolete attribute.
There is still a problem, while we are being notified in intellisense, ideally, we would like to break the build, so is there any way to do this? Perhaps create a custom attribute?
More focused question has been created here.
Prior to VS2013 you could use:
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
so that it doesn't show up in IntelliSense. If the consumer still wants to use it they can, but it won't be as discoverable.
Keith's point about over-engineering still stands though.
Since VS2013 this feature has been removed. As noted in https://github.com/dotnet/roslyn/issues/37478 this was "by design" and apparently will not be brought back.
If a class is [Serialisable]
(i.e. it can be copied around the place as needed) the param-less constructor is needed to deserialise.
I'm guessing that you want to force your code's access to pass defaults for your properties to a parameterised constructor.
Basically you're saying that it's OK for the XmlSerializer
to make a copy and then set properties, but you don't want your own code to.
To some extent I think this is over-designing.
Just add XML comments that detail what properties need initialising (and what to).
Don't use [Obsolete]
, because it isn't. Reserve that for genuinely deprecated methods.
throw new ISaidDoNotUseException();
You could build your own Attribute
derived class, say NonCallableAttribute
to qualify methods, and then add to your build/CI code analysis task the check to monitor if any code is using those methods.
In my opinion, you really cannot force developers to not use the method, but you could detect when someone broke the rule as soon as possible and fix it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With