Vacations are over for many people! Although it seems that Microsoft does not know what that is and they have just released one of the last official previews of C# 11. The development of the eleventh version of its programming language is in the final stages and Microsoft has decided to step on the gas by releasing new features.
These features have been presented by Bill Wagner — Software Developer at Microsoft, and on this occasion he has explained in detail their uses. Let’s go straight to it!
Improved object initialization
The first feature is an improvement of object initializers and constructors. Now you will be able to support them in a much simpler and independent way.
This improvement in object initialization is mainly divided into two parts: requied members and ref
fields. Let’s analyze both of them separately.
Required members
The required
modifier is the first of the enhancements of this feature over C# 11. The main function of this modifier is to tell the object initializer or constructors which properties or fields should be initialized.
According to Bill Wagner in the last C# 11 Preview:
“Required members let you write class and struct types that require callers to set certain properties.”
As usual, we rely on the original example provided:
public class Person
{
public string FirstName { get; init; }
public string LastName {get; init; }
}
Based on this example, Bill comments:
“Callers should use object initializers to set the values of the
FirstName
andLastName
property.”
One of the points to note is that in order for (based on the previous example), a user to set the FirstName
and LastName
properties, it is necessary that the costructor requires them.
To prevent the compiler from returning an error saying that the “required members weren’t initialized”, simply use the required
modifier:
public class Person
{
public required string FirstName { get; init; }
public required string LastName {get; init; }
}
As I said at the beginning, this is a feature released in this latest version of C# 11 but, what if the type was written in a previous version? Well, don’t worry, Microsoft has also thought about it and has the solution.
In the case of having written the type in a previous version, we must set the existing constructors using the SetRequiredMembers
attribute:
public class Person
{
public required string FirstName { get; init; }
public required string LastName {get; init; }
[SetsRequiredMembers]
public Person(string firstName, string lastName)
{
this.FirstName = firstName;
this.LastName = lastName;
}
public Person() {}
}
Microsoft has also added that scoped
values are now added next to ref
fields and now, ref
fields in ref struct
types are possible:
“You can also use the
scoped
keyword to limit the lifetime ofref
parameters.”
If you want to know more about this feature, I recommend you, as always, to consult the original source: Improved object initialization
Generic math support
In this next feature Microsoft focuses on generic math and adds several more advanced features (within this feature). The only thing that Microsoft comments about these advanced features is that it is not common to use them in normal or usual scenarios, but they have a focus towards scenarios of mathematical algorithms of multiple types of numbers.
Even if at this moment you think that you won’t be able to take advantage of this feature, Microsoft says:
“…you’ll benefit indirectly because the runtime uses these features.”
These are the features Microsoft is referring to:
- Static abstract and static virtual members in interfaces
- Relaxed right-shift requirements
- Unsigned right shift operator
- Numeric
IntPtr
Going back to generic math support, the new thing about this is the abstract and static virtual members in the interfaces. Now you can declare a static method via an interface. However, Microsoft warns that it is necessary to provide the implementations of these methods through the classes that implement them.
We also have other minor improvements such as:
- The second operand of a shift operator (>>) no longer needs to be
int
. - You can now use
nuint
, which is the shortened option ofSystem.UIntPtr
. - You can also use
nint
, which is the shortened option ofSystem.IntPtr
. - You will be able to avoid shifts when unsigned shifts have to be made by using unsigned right-shift operator (>>>).
If you want to know more about these features, I recommend you, as always, to consult the original source: Generic math support
Nameof operator Improvement
Last but not least, there is a developer productivity improvement. This time we focus on the nameof
operator, which now has the ability to be used with method parameters.
This way you will be able to use nameof
inside method attribute declarations. As you can’t miss it, Microsoft provides us with this example:
[return: NotNullIfNotNull(nameof(url))]
string? GetTopLevelDomainFromFullUrl(string? url)
If you want to know more about this feature, I recommend you, as always, to consult the original source: Developer productivity
Little else can be gleaned from this latest preview. C# 11 is just around the corner and there are only 2 months left before its official release in November. What else can we expect from Microsoft? Who knows?
If you have been disconnected during these weeks, you may be interested in consulting the previous release, which was released this summer: C# 11 Latest Preview Features
If you want to be among the first to be updated and know all the news about C# and .NET remember to follow me so you don’t miss anything!