C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Info: When you look at the program in Visual Studio, this will result in a warning.
Tip: The actual type referenced by [Obsolete] is ObsoleteAttribute, but you can omit the word Attribute.
Tip 2: The attribute modifies the compiler's view of the Program.Text method. It doesn't affect runtime.
C# program that uses attribute
using System;
class Program
{
static void Main()
{
// Warning: 'Program.Test()' is obsolete
Test();
}
[Obsolete]
static void Test()
{
}
}
Warning generated by program:
'Program.Test()' is obsolete
Note: This provides a way to specify what kind of types the attribute applies to, among other options.
Note 2: We specify to use the attribute with square brackets and the name of the attribute, omitting the word "Attribute" on the end.
PerlsAttribute: This is an attribute class that can only be attached to class types—not fields, methods, or properties.
C# program that declares attribute
using System;
/// <summary>
/// An attribute that can only be attached to classes.
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class PerlsAttribute : Attribute
{
}
/// <summary>
/// Use short syntax to reference attribute.
/// </summary>
[Perls]
class Example1
{
}
/// <summary>
/// Use long syntax to reference attribute.
/// </summary>
[PerlsAttribute]
class Example2
{
}
class Program
{
static void Main()
{
// For compilation.
}
}
C# program that uses attributes, number 2
using System;
/// <summary>
/// Attribute.
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class PerlsAttribute : Attribute
{
/// <summary>
/// Stores string field.
/// </summary>
string _id;
/// <summary>
/// Attribute constructor.
/// </summary>
public PerlsAttribute(string id)
{
this._id = id;
}
/// <summary>
/// Get Id.
/// </summary>
public string Id
{
get { return this._id; }
}
}
/// <summary>
/// Apply attribute.
/// </summary>
[Perls("Dot")]
class Example1
{
}
class Program
{
static void Main()
{
// For compilation.
}
}
Positions: With positional parameters, you rely on the position of the parameters in the constructor.
ConstructorHowever: With named parameters, you simply rely on having specified the correct name.
C# program that uses attributes, number 3
using System;
/// <summary>
/// Attribute.
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class PerlsAttribute : Attribute
{
/// <summary>
/// String field.
/// </summary>
string _id;
/// <summary>
/// Attribute constructor.
/// </summary>
public PerlsAttribute()
{
}
/// <summary>
/// Get and set.
/// </summary>
public string Id
{
get { return this._id; }
set { this._id = value; }
}
}
/// <summary>
/// Set property in the attribute.
/// </summary>
[Perls(Id = "Sam")]
class Example1
{
}
class Program
{
static void Main()
{
// For compilation.
}
}
Warning: Whenever you need to use DllImport, you are bound to have difficulties. Interop introduces extra layers of complexity.
Example: Get an array of all the fields in your type. Then perform an action based on what data the attribute of each type contains.
Info: In compiler theory, the attribute data would become part of the symbol table.
And: The symbol table is used throughout the construction of the object code in further compiler phases.
Quote: C# enables programmers to invent new kinds of declarative information, called attributes (The C# Programming Language).