C# Const (How It Works For Developers)

In C#, a const keyword is a powerful tool for defining constant fields or values that are known at compile time. These values are immutable, meaning once they are set, their value cannot be changed throughout the program. Utilizing const can make your code more readable and maintainable by providing a clear indication of values that are meant to remain constant. In this article, we'll discuss the const keyword and IronPDF library.

Declaring Constant Variables

To declare a constant variable, you use the const keyword followed by a data type, and then immediately initialize it. For example, const int myConstValue = 100; defines an integer constant. It's important to note that a constant variable must be initialized when it is declared, as its value is meant to be compile time, and fully evaluated before the program is run.

public class Program
{
    public const int MaxSize = 10;
    static void Main(string[] args)
    {
        Console.WriteLine(MaxSize);
    }
}
public class Program
{
    public const int MaxSize = 10;
    static void Main(string[] args)
    {
        Console.WriteLine(MaxSize);
    }
}
Public Class Program
	Public Const MaxSize As Integer = 10
	Shared Sub Main(ByVal args() As String)
		Console.WriteLine(MaxSize)
	End Sub
End Class
VB   C#

C# Const (How It Works For Developers): Figure 1 - Const Output

This example illustrates a simple use of a constant integer (const int) within a class. The MaxSize constant is accessible within the same class and can be used directly in the static void Main method.

const vs. readonly Variables

While both const and readonly keywords are used to declare immutable values, there are important differences between them. A const field is a compile-time constant, meaning its value is determined at compile time and embedded directly into the Intermediate Language (IL) code. This makes it static, and it cannot be modified.

On the other hand, a readonly variable can be assigned either at the time of declaration or within a constructor of the class. This allows for some flexibility, as readonly fields can have different values depending on the constructor used to instantiate the class.

public class Program
{
    public const string ConstExample = "Constant"; // const string
    public readonly string ReadonlyExample;
    public Program()
    {
        ReadonlyExample = "Initialized at runtime";
    }
    static void Main(string[] args)
    {
        Program p = new Program();
        Console.WriteLine(ConstExample);
        Console.WriteLine(p.ReadonlyExample);
    }
}
public class Program
{
    public const string ConstExample = "Constant"; // const string
    public readonly string ReadonlyExample;
    public Program()
    {
        ReadonlyExample = "Initialized at runtime";
    }
    static void Main(string[] args)
    {
        Program p = new Program();
        Console.WriteLine(ConstExample);
        Console.WriteLine(p.ReadonlyExample);
    }
}
Public Class Program
	Public Const ConstExample As String = "Constant" ' const string
	Public ReadOnly ReadonlyExample As String
	Public Sub New()
		ReadonlyExample = "Initialized at runtime"
	End Sub
	Shared Sub Main(ByVal args() As String)
		Dim p As New Program()
		Console.WriteLine(ConstExample)
		Console.WriteLine(p.ReadonlyExample)
	End Sub
End Class
VB   C#

C# Const (How It Works For Developers): Figure 2 - Readonly Field Output

Scope of const Variables

Constant variables can be declared within a method or as a member of a class. When you declare a const variable within a method, it's known as a local constant. Local constants are only accessible within the method they are declared in.

public class Program
{
    static void DemoMethod()
    {
        const int LocalConst = 5; // local constant
        Console.WriteLine(LocalConst);
    }
}
public class Program
{
    static void DemoMethod()
    {
        const int LocalConst = 5; // local constant
        Console.WriteLine(LocalConst);
    }
}
Public Class Program
	Private Shared Sub DemoMethod()
		Const LocalConst As Integer = 5 ' local constant
		Console.WriteLine(LocalConst)
	End Sub
End Class
VB   C#

C# Const (How It Works For Developers): Figure 3 - Local Constant Output

In contrast, when a const is declared within a class but outside of any method, it is accessible from any static function of the same one, because const fields are implicitly static. However, attempting to access a const field from an instance method without referencing it through the class name will result in a compilation error.

Compile Time vs. Run Time Constants

The main characteristic of const values is that they are evaluated at compile time. This means that the value of a const field must be known and fully evaluated by the compiler. This is in contrast to variables that are evaluated at run time, whose values are determined during the execution of the program.

For instance, attempting to assign a value to a const field based on a calculation performed at run time will cause a compile-time error. The compiler requires const values to be assigned from constant expressions or literal values that are known at compile time.

const double Pi = Math.PI; // This will cause a compile time error
const double Pi = Math.PI; // This will cause a compile time error
Const Pi As Double = Math.PI ' This will cause a compile time error
VB   C#

Advanced Use of Constants and Static Members in C#

Beyond the basics of const and readonly in C#, understanding how to work with constant expressions, static constructors, and static fields can elevate your coding practices, especially when dealing with constant values that need to be shared across instances of a class.

Constant Expressions

A constant expression in C# is an expression that can be fully evaluated at compile time. Therefore, when you declare a const variable, the right-hand side of its declaration must be a constant expression. This ensures that the const value is fixed and can be embedded directly into the compiled code, leading to highly optimized and efficient applications.

public class Calculator
{
    public const int Multiplier = 2;
    public const int DoubleMultiplier = Multiplier * 2; // Constant expression
}
public class Calculator
{
    public const int Multiplier = 2;
    public const int DoubleMultiplier = Multiplier * 2; // Constant expression
}
Public Class Calculator
	Public Const Multiplier As Integer = 2
	Public Const DoubleMultiplier As Integer = Multiplier * 2 ' Constant expression
End Class
VB   C#

In this example, DoubleMultiplier is a constant expression because it is calculated using another constant value, which makes it eligible to be a compile-time constant.

Static Constructor

A static constructor in C# is a special constructor that initializes static fields of the class. It is called automatically before the first instance is created or any static members are referenced. Static constructors are useful for complex initialization of static data or to perform actions that need to happen once per type rather than per instance.

public class Program
{
    public static readonly string StartTime;
    static Program()
    {
        StartTime = DateTime.Now.ToString("T");
    }
    public static void DisplayStartTime()
    {
        Console.WriteLine($"Program started at: {StartTime}");
    }
}
public class Program
{
    public static readonly string StartTime;
    static Program()
    {
        StartTime = DateTime.Now.ToString("T");
    }
    public static void DisplayStartTime()
    {
        Console.WriteLine($"Program started at: {StartTime}");
    }
}
Public Class Program
	Public Shared ReadOnly StartTime As String
	Shared Sub New()
		StartTime = DateTime.Now.ToString("T")
	End Sub
	Public Shared Sub DisplayStartTime()
		Console.WriteLine($"Program started at: {StartTime}")
	End Sub
End Class
VB   C#

The static constructor initializes the StartTime field with the current time. This value is then accessible through the DisplayStartTime static method, showcasing how static constructors can be used to initialize readonly fields with values that are not known until runtime.

Static Fields and the readonly and static Keywords

Static fields belong to the class rather than any instance of the class and are declared using the static keyword. When combined with the readonly keyword, a static field can be initialized either at the point of declaration or within a static constructor and cannot be modified afterwards.

public class Configuration
{
    public static readonly int MaxUsers;
    public const int TimeoutSeconds = 30;
    static Configuration()
    {
        MaxUsers = FetchMaxUsersFromConfig();
    }
    private static int FetchMaxUsersFromConfig()
    {
        // Imagine this method reads from a configuration file
        return 100;
    }
}
public class Configuration
{
    public static readonly int MaxUsers;
    public const int TimeoutSeconds = 30;
    static Configuration()
    {
        MaxUsers = FetchMaxUsersFromConfig();
    }
    private static int FetchMaxUsersFromConfig()
    {
        // Imagine this method reads from a configuration file
        return 100;
    }
}
Public Class Configuration
	Public Shared ReadOnly MaxUsers As Integer
	Public Const TimeoutSeconds As Integer = 30
	Shared Sub New()
		MaxUsers = FetchMaxUsersFromConfig()
	End Sub
	Private Shared Function FetchMaxUsersFromConfig() As Integer
		' Imagine this method reads from a configuration file
		Return 100
	End Function
End Class
VB   C#

This example demonstrates the use of a constructor that is static to initialize a readonly static field, MaxUsers, with a value that is retrieved at runtime, possibly from a configuration file. The const field, TimeoutSeconds, represents a compile-time constant that is directly embedded into the code.

Introduction to IronPDF

C# Const (How It Works For Developers): Figure 4 - IronPDF

IronPDF is a versatile library that enables developers to create, edit, and read PDF documents in .NET applications. This powerful tool simplifies PDF generation by allowing developers to convert HTML to PDF, manipulate content, and extract data from PDF files with ease.

Getting Started with IronPDF and const Example

To demonstrate how IronPDF can be integrated into a .NET project, let's look at a simple example where we use a constant to define the HTML string that we want to convert into a PDF document.

using IronPdf;
public class PdfGenerator
{
    // Defining a constant HTML template
    public const string HtmlTemplate = @"
        <html>
            <head>
                <title>PDF Report</title>
            </head>
            <body>
                <h1>IronPDF Report</h1>
                <p>This is a simple PDF document generated from HTML string using IronPDF.</p>
            </body>
        </html>";
    public static void CreatePdf(string filePath)
    {
        IronPdf.License.LicenseKey = "License";
        // Create a new PDF document from HTML template
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(HtmlTemplate);
        // Save the PDF document to a file
        pdf.SaveAs(filePath);
        Console.WriteLine($"PDF generated successfully at {filePath}");
    }
}
class Program
{
    static void Main(string[] args)
    {
        PdfGenerator.CreatePdf("example.pdf");
    }
}
using IronPdf;
public class PdfGenerator
{
    // Defining a constant HTML template
    public const string HtmlTemplate = @"
        <html>
            <head>
                <title>PDF Report</title>
            </head>
            <body>
                <h1>IronPDF Report</h1>
                <p>This is a simple PDF document generated from HTML string using IronPDF.</p>
            </body>
        </html>";
    public static void CreatePdf(string filePath)
    {
        IronPdf.License.LicenseKey = "License";
        // Create a new PDF document from HTML template
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(HtmlTemplate);
        // Save the PDF document to a file
        pdf.SaveAs(filePath);
        Console.WriteLine($"PDF generated successfully at {filePath}");
    }
}
class Program
{
    static void Main(string[] args)
    {
        PdfGenerator.CreatePdf("example.pdf");
    }
}
Imports IronPdf
Public Class PdfGenerator
	' Defining a constant HTML template
	Public Const HtmlTemplate As String = "
        <html>
            <head>
                <title>PDF Report</title>
            </head>
            <body>
                <h1>IronPDF Report</h1>
                <p>This is a simple PDF document generated from HTML string using IronPDF.</p>
            </body>
        </html>"
	Public Shared Sub CreatePdf(ByVal filePath As String)
		IronPdf.License.LicenseKey = "License"
		' Create a new PDF document from HTML template
		Dim renderer = New ChromePdfRenderer()
		Dim pdf = renderer.RenderHtmlAsPdf(HtmlTemplate)
		' Save the PDF document to a file
		pdf.SaveAs(filePath)
		Console.WriteLine($"PDF generated successfully at {filePath}")
	End Sub
End Class
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		PdfGenerator.CreatePdf("example.pdf")
	End Sub
End Class
VB   C#

In this example, the HtmlTemplate constant is defined with simple HTML content that serves as the source for our PDF document. The CreatePdf method utilizes IronPDF's ChromePdfRenderer class to convert this HTML into a PDF and save it to the specified file path. This showcases the ease with which IronPDF can be used to generate PDFs from static HTML content, leveraging the const keyword for defining immutable HTML templates.

Output

Here is the Output PDF File:

C# Const (How It Works For Developers): Figure 5 - PDF Output

Conclusion

C# Const (How It Works For Developers): Figure 6 - Licensing

In C#, the const keyword is a valuable feature for defining immutable values that are known at compile time. It helps improve the readability and maintainability of your code by clearly indicating which values are constants. Remember, const variables are implicitly static, must be initialized at declaration, and their values must be compile-time constants. Comparatively, readonly variables offer more flexibility but are initialized at run time.

IronPDF stands out not only for its robust features in PDF manipulation but also for its flexible adoption model. For developers and organizations looking to explore its capabilities, IronPDF offers a free trial, providing an excellent opportunity to evaluate its features and integration ease without initial investment.

When ready to move forward with IronPDF for commercial use, licensing options start from $749. This pricing structure is designed to accommodate the needs of different project sizes and types, ensuring that you can choose a license that best suits your development and distribution plans.