C# Compiler Support for ReadOnlyReferences
-
When I saw mention of compiler support for
ReadOnlyReferences
in the C# 7.2 language, for passing variables by reference but without exposing data to modifications in a list of new features in version 4.7.2 of the Microsoft .NET Framework in What’s new in Microsoft .Net Framework 4.8, I realized that this is a big deal. Here's why. * Without this option, the only way to pass a read-only reference to an object is to create an adapter, so that you can pass through the properties through getter methods, omitting setters entirely. * Writing such an adapter is time consuming and error-prone. * Using the adapter adds a layer to every request to read a property on the underlying object, because the request must pass through the getter on the adapter, which passes it along to the getter on the adapted object. * If your project has many of these, your source code tree has lots of branches that add little value, and the extra objects make the assembly bigger. See C# Futures: Read-Only References and Structs for additional details not mentioned in the InfoWorld article, not the least of which is that this parameter modifier applies to structs, too. Presumably, that includes the system-defined structs, such as DateTime, char, and others.David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting
If you're passing
struct
s around as readonly references, you'll want to make sure thestruct
itself is readonly as well. The same applies if you're storing them in areadonly
field. Otherwise, every time you access a property or method on thestruct
, the compiler will make a defensive copy to enforce the readonly-ness of the value. The ‘in’-modifier and the readonly structs in C# – Dissecting the code[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
If you're passing
struct
s around as readonly references, you'll want to make sure thestruct
itself is readonly as well. The same applies if you're storing them in areadonly
field. Otherwise, every time you access a property or method on thestruct
, the compiler will make a defensive copy to enforce the readonly-ness of the value. The ‘in’-modifier and the readonly structs in C# – Dissecting the code[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
That is precisely the point of the
ReadOnlyReference
modifier, which you would discover if you read that article all the way to the end.David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting
-
That is precisely the point of the
ReadOnlyReference
modifier, which you would discover if you read that article all the way to the end.David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting
Which one? The article from 2017, talking about the
in
modifier and readonlystruct
s, which have already been released? Or the infoworld "subscriber only" article, which can't be read without signing up? :doh:
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
Which one? The article from 2017, talking about the
in
modifier and readonlystruct
s, which have already been released? Or the infoworld "subscriber only" article, which can't be read without signing up? :doh:
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
The article that you cited, about the in modifier is very explicit in it summary.
David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting
-
When I saw mention of compiler support for
ReadOnlyReferences
in the C# 7.2 language, for passing variables by reference but without exposing data to modifications in a list of new features in version 4.7.2 of the Microsoft .NET Framework in What’s new in Microsoft .Net Framework 4.8, I realized that this is a big deal. Here's why. * Without this option, the only way to pass a read-only reference to an object is to create an adapter, so that you can pass through the properties through getter methods, omitting setters entirely. * Writing such an adapter is time consuming and error-prone. * Using the adapter adds a layer to every request to read a property on the underlying object, because the request must pass through the getter on the adapter, which passes it along to the getter on the adapted object. * If your project has many of these, your source code tree has lots of branches that add little value, and the extra objects make the assembly bigger. See C# Futures: Read-Only References and Structs for additional details not mentioned in the InfoWorld article, not the least of which is that this parameter modifier applies to structs, too. Presumably, that includes the system-defined structs, such as DateTime, char, and others.David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting
-
I use C++ from time to time, too, but how is that related to this thread?
David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting
-
When I saw mention of compiler support for
ReadOnlyReferences
in the C# 7.2 language, for passing variables by reference but without exposing data to modifications in a list of new features in version 4.7.2 of the Microsoft .NET Framework in What’s new in Microsoft .Net Framework 4.8, I realized that this is a big deal. Here's why. * Without this option, the only way to pass a read-only reference to an object is to create an adapter, so that you can pass through the properties through getter methods, omitting setters entirely. * Writing such an adapter is time consuming and error-prone. * Using the adapter adds a layer to every request to read a property on the underlying object, because the request must pass through the getter on the adapter, which passes it along to the getter on the adapted object. * If your project has many of these, your source code tree has lots of branches that add little value, and the extra objects make the assembly bigger. See C# Futures: Read-Only References and Structs for additional details not mentioned in the InfoWorld article, not the least of which is that this parameter modifier applies to structs, too. Presumably, that includes the system-defined structs, such as DateTime, char, and others.David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting
It also solves some sticky issues when you want to ensure that a method cannot modify contents of an object. It would have been a lot of work before to protect data in an object so that it could not be modified. You would have to basically deep clone it and use the clone.
-
It also solves some sticky issues when you want to ensure that a method cannot modify contents of an object. It would have been a lot of work before to protect data in an object so that it could not be modified. You would have to basically deep clone it and use the clone.
Especially given that you may need only a subset of its methods and properties, it's often easier to create and adapter that exposes the needed methods as read only properties of itself, and forwards the required methods to the private instance which it adapts. It's usually straightforward to create a basic adapter to meet an immediate need, which can subsequently be extended to support more read only properties and/or forwarded methods.
David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting
-
Especially given that you may need only a subset of its methods and properties, it's often easier to create and adapter that exposes the needed methods as read only properties of itself, and forwards the required methods to the private instance which it adapts. It's usually straightforward to create a basic adapter to meet an immediate need, which can subsequently be extended to support more read only properties and/or forwarded methods.
David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting
If an adapter makes sense, then yes you can, but that may be a lot of adapters if there are many levels that need to be created for different objects, and if adapter does not make sense, them may be increasing maintenance significantly as need to provide different access to methods and properties.
-
If an adapter makes sense, then yes you can, but that may be a lot of adapters if there are many levels that need to be created for different objects, and if adapter does not make sense, them may be increasing maintenance significantly as need to provide different access to methods and properties.
All the better! If
ReadOnlyReference
enables you to dispense with multiple adapters, you are further ahead of the game in reducing code bloat. However, I usually prefer to extend an existing adapter over creating a new one, especially if the extension just adds a property. The exception to that rule is if that property is hidden to prevent information disclosure or leakage.David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting
-
When I saw mention of compiler support for
ReadOnlyReferences
in the C# 7.2 language, for passing variables by reference but without exposing data to modifications in a list of new features in version 4.7.2 of the Microsoft .NET Framework in What’s new in Microsoft .Net Framework 4.8, I realized that this is a big deal. Here's why. * Without this option, the only way to pass a read-only reference to an object is to create an adapter, so that you can pass through the properties through getter methods, omitting setters entirely. * Writing such an adapter is time consuming and error-prone. * Using the adapter adds a layer to every request to read a property on the underlying object, because the request must pass through the getter on the adapter, which passes it along to the getter on the adapted object. * If your project has many of these, your source code tree has lots of branches that add little value, and the extra objects make the assembly bigger. See C# Futures: Read-Only References and Structs for additional details not mentioned in the InfoWorld article, not the least of which is that this parameter modifier applies to structs, too. Presumably, that includes the system-defined structs, such as DateTime, char, and others.David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting
David A. Gray wrote:
lots of branches that add little value, and the extra objects make the assembly bigger
Don't worry, we'll never need more than 640K of RAM!
CQ de W5ALT
Walt Fair, Jr., P. E. Comport Computing Specializing in Technical Engineering Software