ZetCode

C# static

last modified July 5, 2023

In this article we cover the static modifier keyword in C#.

The static modifier

A static member belongs to the type rather than to a specific object.

Console.WriteLine(Math.Abs(-5));

Here, the Abs is a static method which belongs to a static Math type. We refer to the method by the type name followed by a dot operator and a member method name.

In classes, interfaces, and structs, we can use the static modifier for fields, methods, properties, operators, events, and constructors.

Static methods can work only with static members; they cannot access instance variables.

The following are features of a static class:

  • contains only static members
  • cannot be instantiated
  • is sealed; other classes cannot inherit from it
  • cannot contain instance constructors

The following are features of a static constructor:

  • a class or struct can only have one static constructor
  • static constructors cannot be inherited or overloaded
  • a static constructor cannot be called directly
  • it is automatically called by the common language runtime
  • if we don't provide a static constructor to initialize static fields, all static fields are initialized to their default values

C# static member

A static member belongs to the type.

Program.cs
namespace StaticMember;
static class MyMath
{
 public static double PI = 3.14159265358979323846;
}
class Program
{
 static void Main(string[] args)
 {
 Console.WriteLine(MyMath.PI);
 Console.WriteLine(Math.Abs(-5));
 }
}

We have a static MyMath class which contains a single static member.

Console.WriteLine(MyMath.PI);
Console.WriteLine(Math.Abs(-5));

We refer to the static PI member of our MyMath class. Also, we refer to the static Abs method of the built-in Math class.

$ dotnet run
3.141592653589793
5

C# static method

A static method can access only static variables. It cannot access instance variables. A static method can only call other static methods.

Program.cs
namespace SimpleEx;
class Program
{
 static int i = 0;
 static void Main(string[] args)
 {
 Console.WriteLine(i);
 i = i + 5;
 Console.WriteLine(i);
 Inc();
 Console.WriteLine(i);
 Dec();
 Console.WriteLine(i);
 }
 static void Inc()
 {
 i = i + 1;
 }
 static void Dec()
 {
 i = i - 1;
 }
}

In the example, we have a static variable i and static methods Main, Console.WriteLine, Inc, and Dec.

static void Main(string[] args)
...

The Main method is a classic entry point of a C# application. Inside a static Main method, we can call only static methods.

$ dotnet run
0
5
6
5

C# extension methods

The static keyword is used to define extension methods. Extension methods are methods that can be inserted to existing types without creating a new derived type, recompiling, or otherwise modifying the original type.

Program.cs
var vals = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
vals.Shuffle();
var res = string.Join(" ", vals);
Console.WriteLine(res);
static class MyExtensions
{
 private static Random rng = new Random();
 public static void Shuffle<T>(this IList<T> vals)
 {
 int n = vals.Count;
 while (n > 1)
 {
 n--;
 int k = rng.Next(n + 1);
 T value = vals[k];
 vals[k] = vals[n];
 vals[n] = value;
 }
 }
}

In the example, we define a Shuffle extension method.

vals.Shuffle();

We call the Shuffle extension method. The compiler translates it into the MyExtensions.Shuffle(vals);.

static class MyExtensions

The extension method is defined inside a static class.

private static Random rng = new Random();

The member that we use to generate random order is static.

public static void Shuffle<T>(this IList<T> vals)

The Shuffle method is declared with the static modifier as well.

$ dotnet run
8 7 5 4 1 6 3 2
$ dotnet run
1 3 6 8 5 7 2 4

C# using static directive

The using static allows us to access static members and nested types of a type without having to qualify the access with the type name.

Program.cs
using static System.Math;
Console.WriteLine(Sqrt(3*3 + 4*4));

In the example, we import the Sqrt method into our namespace.

Source

static modifier - language reference

In this article we have worked with the static modifier in C#.

Author

My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.

List all C# tutorials.

AltStyle によって変換されたページ (->オリジナル) /