DEV Community

Cover image for Enhancing Object Initializers with the “From-the-End” Index Operator
Sukhpinder Singh
Sukhpinder Singh

Posted on • Originally published at Medium

Enhancing Object Initializers with the “From-the-End” Index Operator

In the dynamic landscape of programming languages, even seemingly minor enhancements can significantly impact code readability and efficiency.

One such enhancement introduced in C# 13 is the “from-the-end” index operator (^). It allows developers to access elements from the end of an array or collection, simplifying array initialization within object initializers.

Compatibility

Keep in mind that this feature is available starting from C# 13. If you’re working with earlier versions, you’ll need to stick to indexing from the front.

Understanding the “From-the-End” Index Operator

The ^ operator, also known as the “from-the-end” index operator, provides a convenient way to access elements from the end of an array or collection. It is particularly useful when initializing arrays within object initializers.

Object Initializers in C

Before diving into the new feature, let’s revisit object initializers. In C#, object initializers allow you to create an instance of an object and set its properties or fields in a single statement. This eliminates the need for invoking constructors followed by multiple assignment statements.

Consider a simple example using a Cat class:

public class Cat
{
    public int Age { get; set; }
    public string? Name { get; set; }
}

// Using object initializer
Cat cat = new Cat { Age = 10, Name = "Fluffy" };
Enter fullscreen mode Exit fullscreen mode

In the above code, we create a Cat instance and set its Age and Name properties using an object initializer.

Leveraging the “From-the-End” Index Operator

Now let’s explore the exciting part — the use of the ^ operator within an object initializer. Imagine we have a Matrix class with an indexer that allows us to set values at specific positions:

public class Matrix
{
    private double[,] storage = new double[3, 3];
    public double this[int row, int column]
    {
        get => storage[row, column];
        set => storage[row, column] = value;
    }
}
Enter fullscreen mode Exit fullscreen mode

Suppose we want to initialize an identity matrix using the Matrix class. Traditionally, we’d index the elements from the front:

var identity = new Matrix
{
    [0, 0] = 1.0,
    [0, 1] = 0.0,
    [0, 2] = 0.0,
    // ... and so on
};
Enter fullscreen mode Exit fullscreen mode

However, with the new feature, we can use the “from-the-end” index operator to make our code more concise:

var identity = new Matrix
{
    [^0, ^0] = 1.0,
    [^0, ^1] = 0.0,
    [^0, ^2] = 0.0,
    // ... and so on
};
Enter fullscreen mode Exit fullscreen mode

By using ^0, we indicate the last element in each dimension. This not only improves readability but also aligns with our natural understanding of matrices.

C# Programming🚀

Thank you for being a part of the C# community! Before you leave:

If you’ve made it this far, please show your appreciation with a clap and follow the author! 👏️️

Follow us: X | LinkedIn | Dev.to | Hashnode | Newsletter
Visit our other platforms: GitHub | Instagram
More content at C# Programming

Jetbrains image

Build Secure, Ship Fast

Discover best practices to secure CI/CD without slowing down your pipeline.

Read more

Top comments (0)

Jetbrains image

Is Your CI/CD Server a Prime Target for Attack?

57% of organizations have suffered from a security incident related to DevOps toolchain exposures. It makes sense—CI/CD servers have access to source code, a highly valuable asset. Is yours secure? Check out nine practical tips to protect your CI/CD.

Learn more

AWS GenAI LIVE! | May 14, 2025

GenAI LIVE! is a dynamic live-streamed show exploring how AWS and our partners are helping organizations unlock real value with generative AI.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️