== Why is this an issue?

When defining custom attributes, https://learn.microsoft.com/en-us/dotnet/api/system.attributeusageattribute[AttributeUsageAttribute] must be used to indicate where the attribute can be applied. This will:

* indicate how the attribute can be used
* prevent it from being used at invalid locations

== How to fix it

=== Code examples

==== Noncompliant code example

[source,csharp,diff-id=1,diff-type=noncompliant]
----
public sealed class MyAttribute : Attribute // Noncompliant - AttributeUsage is missing
{
    private string text;

    public MyAttribute(string text)
    {
        this.text = text;
    }

    public string Text => text;
}
----

==== Compliant solution

[source,csharp,diff-id=1,diff-type=compliant]
----
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
public sealed class MyAttribute : Attribute
{
    private string text;

    public MyAttribute(string text)
    {
        this.text = text;
    }

    public string Text => text;
}
----

== Resources

=== Documentation

* Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/csharp/advanced-topics/reflection-and-attributes/creating-custom-attributes[Create custom attributes]
* Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/api/system.attributeusageattribute[AttributeUsageAttribute class]
* Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/api/system.attribute[Attribute class]

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::../message.adoc[]

include::../highlighting.adoc[]

endif::env-github,rspecator-view[]
