> ## Documentation Index
> Fetch the complete documentation index at: https://docs.syntblaze.com/llms.txt
> Use this file to discover all available pages before exploring further.

# C# AttributeUsage Attribute

The `AttributeUsage` attribute is a meta-attribute in C# used to define the application constraints and behaviors of a custom attribute class. Applied directly to a class inheriting from `System.Attribute`, it dictates the syntactic program elements to which the custom attribute can be attached, whether it can be applied multiple times to the same element, and whether derived classes inherit the attribute.

```csharp theme={"dark"}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
public class MyCustomAttribute : Attribute
{
    // Attribute implementation
}
```

The `AttributeUsage` attribute is instantiated using one positional parameter and two optional named parameters.

## ValidOn (Positional Parameter)

The first parameter is mandatory and maps to the `ValidOn` property. It defines the specific C# elements (such as classes, methods, properties, or assemblies) where the custom attribute is legally allowed to be placed.

* **Type:** `System.AttributeTargets`
* **Mechanics:** `AttributeTargets` is a flags enumeration. You can specify a single target (e.g., `AttributeTargets.Class`) or combine multiple targets using the bitwise OR operator (`|`). To allow the attribute on any valid element, use `AttributeTargets.All`.
* **Compilation:** If a developer attempts to apply the custom attribute to a program element not specified in the `ValidOn` parameter, the C# compiler will generate error CS0592.

## AllowMultiple (Named Parameter)

This property determines whether more than one instance of your custom attribute can be applied to a single program element.

* **Type:** `bool`
* **Default Value:** `false`
* **Mechanics:** When set to `false`, applying the attribute multiple times to the same target results in compiler error CS0579 ("Duplicate 'AttributeName' attribute"). When set to `true`, the compiler permits stacking multiple instances of the attribute on the same target, which is typically parsed at runtime via reflection using `MemberInfo.GetCustomAttributes`.

## Inherited (Named Parameter)

This property controls the inheritance semantics of the custom attribute across class hierarchies and overridden members.

* **Type:** `bool`
* **Default Value:** `true`
* **Mechanics:**
  * When set to `true`, if the custom attribute is applied to a base class, any class deriving from that base class will automatically possess the attribute. Similarly, it applies to overridden virtual methods and properties.
  * When set to `false`, the attribute is strictly bound to the specific type or member it is applied to and does not flow down the inheritance chain.
  * *Note:* This property only affects runtime reflection behavior (specifically when passing `inherit: true` to reflection methods like `Type.GetCustomAttributes`). It does not cause the attribute to physically appear in the derived class's metadata within the compiled IL.

<div
  style={{ 
display: "flex", 
justifyContent: "space-between", 
alignItems: "center", 
maxWidth: "754px", 
padding: "1rem 0",
marginBottom: "24px"
}}
>
  <span style={{ fontWeight: "bold", fontSize: "1.25rem", color: "var(--tw-prose-headings)", fontFamily: "Inter, ui-sans-serif, system-ui, sans-serif" }}>Tired of Poor C# Skills? Fix That With Deep Grasping!</span>

  <a
    href="https://syntblaze.com"
    target="_blank"
    style={{ 
  marginLeft: "24px",
  textDecoration: "none", 
  backgroundColor: "#007AFF",
  color: "#ffffff", 
  padding: "6px 16px", 
  borderRadius: "16px",
  fontSize: "0.9rem",
  fontWeight: "600",
  textAlign: "center",
  transition: "background-color 0.2s ease"
}}
  >
    Learn More
  </a>
</div>

<div style={{ display: "flex", gap: "12px", flexWrap: "wrap" }}>
  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/skill-tracking.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=b9b0305c93bb501c9e767b5c76c88835" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/skill-tracking.png" />

  <img src="https://mintcdn.com/syntblazellc/23tyuOzaWS88qFlc/images/nuggets.png?fit=max&auto=format&n=23tyuOzaWS88qFlc&q=85&s=c86c80197299762989e9b882419b2109" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/nuggets.png" />

  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/bite-sized-exercises.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=a65f9a38c37ff28ab73ed783c53c60e3" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/bite-sized-exercises.png" />
</div>

<div style={{ display: "flex", gap: "12px", flexWrap: "wrap", marginTop: "12px" }}>
  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/mastery-chain.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=748a1763454713e679260fbb95f154a2" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/mastery-chain.png" />

  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/element-previews.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=242f61448ff5dd6deaaab2dccc13b507" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/element-previews.png" />

  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/element-explanations.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=cf0fc1c31f9cd0fc26716781be05fbc9" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/element-explanations.png" />
</div>
