Method chaining with short-circuit parameter evaluation
-
I am testing several depths of properties in an object to make sure they are safe before I call them:
Test.NotNull(myObject);
if (myObject != null)
{
Test.NotNull(myObject.MyProperty);
if (myObject.MyProperty != null)
Test.IsPositive(myObject.MyProperty.Id);
...
}I was thinking it would be really cool to be able to do
Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
but obviously if
myObject == null
then we have a runtime null ref error because, regardless of what the NotNull method returns as part of the chaining,myObject
is still null. So this got me thinking: You can doif (myObject != null && myObject.MyProperty != null)
because of short circuit boolean evaluation in C#, but I was wondering, with my fairly mainstream experience in languages, if there are languages out there that would allow chaining of methods with short circuit evaluation. Essentially you'd have to have the input parameter be resolved after the method was called in order to have the method be able to say "I don't need the input parameter, please just ignore it". Has anyone heard of this? Would it open up a World Of Pain when it comes to debugging? Would it be useful? Am I procrastinating? --- Update: and it turns out this leads into a great discussion of extension methods. See The Maybe Monad[^] and Chained null checks and the Maybe monad[^] for two ways of achieving this. Once you've done that, debate the correctness of extension methods that are able by design to operate on a null references. I will be over there looking for new, shiny, distracting things.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
If only there was some sort of site where people could write articles on exactly this issue[^]! ;P
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
If voting was available, I would of shot you a 5, but alas.....
Software Kinetics - Dependable Software news
You could just toss a :thumbsup: in place of a 5 vote.
"I've seen more information on a frickin' sticky note!" - Dave Kreskowiak
-
I am testing several depths of properties in an object to make sure they are safe before I call them:
Test.NotNull(myObject);
if (myObject != null)
{
Test.NotNull(myObject.MyProperty);
if (myObject.MyProperty != null)
Test.IsPositive(myObject.MyProperty.Id);
...
}I was thinking it would be really cool to be able to do
Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
but obviously if
myObject == null
then we have a runtime null ref error because, regardless of what the NotNull method returns as part of the chaining,myObject
is still null. So this got me thinking: You can doif (myObject != null && myObject.MyProperty != null)
because of short circuit boolean evaluation in C#, but I was wondering, with my fairly mainstream experience in languages, if there are languages out there that would allow chaining of methods with short circuit evaluation. Essentially you'd have to have the input parameter be resolved after the method was called in order to have the method be able to say "I don't need the input parameter, please just ignore it". Has anyone heard of this? Would it open up a World Of Pain when it comes to debugging? Would it be useful? Am I procrastinating? --- Update: and it turns out this leads into a great discussion of extension methods. See The Maybe Monad[^] and Chained null checks and the Maybe monad[^] for two ways of achieving this. Once you've done that, debate the correctness of extension methods that are able by design to operate on a null references. I will be over there looking for new, shiny, distracting things.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
Have you looked at this CP article by Dimitri Nesteruk[^] It looks very useful.
"I do not have to forgive my enemies, I have had them all shot." — Ramón Maria Narváez (1800-68). "I don't need to shoot my enemies, I don't have any." - Me (2012).
-
If only there was some sort of site where people could write articles on exactly this issue[^]! ;P
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
Yes! :thumbsup:
-
Have you looked at this CP article by Dimitri Nesteruk[^] It looks very useful.
"I do not have to forgive my enemies, I have had them all shot." — Ramón Maria Narváez (1800-68). "I don't need to shoot my enemies, I don't have any." - Me (2012).
You were beat to the punch. :)
-
I am testing several depths of properties in an object to make sure they are safe before I call them:
Test.NotNull(myObject);
if (myObject != null)
{
Test.NotNull(myObject.MyProperty);
if (myObject.MyProperty != null)
Test.IsPositive(myObject.MyProperty.Id);
...
}I was thinking it would be really cool to be able to do
Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
but obviously if
myObject == null
then we have a runtime null ref error because, regardless of what the NotNull method returns as part of the chaining,myObject
is still null. So this got me thinking: You can doif (myObject != null && myObject.MyProperty != null)
because of short circuit boolean evaluation in C#, but I was wondering, with my fairly mainstream experience in languages, if there are languages out there that would allow chaining of methods with short circuit evaluation. Essentially you'd have to have the input parameter be resolved after the method was called in order to have the method be able to say "I don't need the input parameter, please just ignore it". Has anyone heard of this? Would it open up a World Of Pain when it comes to debugging? Would it be useful? Am I procrastinating? --- Update: and it turns out this leads into a great discussion of extension methods. See The Maybe Monad[^] and Chained null checks and the Maybe monad[^] for two ways of achieving this. Once you've done that, debate the correctness of extension methods that are able by design to operate on a null references. I will be over there looking for new, shiny, distracting things.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
In C++ you could do this with an 'instance' call like this:
if (this != NULL)
{
return this->real_stuff;
}
else
{
return default_stuff;
}As others have mentioned, in C# you can do this with extension methods:
namespace Test
{
public class Widget
{
}
public static class WidgetExtensions
{
static public void Method(this Widget _this)
{
if (_this != null)
{
Console.WriteLine("real widget");
}
else
{
Console.WriteLine("null widget");
}
}
}
class Program
{
static void Main(string[] args)
{
Widget widget = null;widget.Method(); widget = new Widget(); widget.Method(); } }
}
results in the output
null widget
real widgetSoftware Zen:
delete this;
-
If only there was some sort of site where people could write articles on exactly this issue[^]! ;P
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
That settles it for me, I want voting back. :thumbsup:
People say nothing is impossible, but I do nothing every day.
-
Or a decorator, preferably combined with the NullObject-pattern :)
Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^] They hate us for our freedom![^]
System.DBNull is an example of the pattern. And I can't describe in words how much I dislike it.
People say nothing is impossible, but I do nothing every day.
-
You were beat to the punch. :)
So I was. Great minds think alike but in my case I'll pass up on the citation. ;) Hopefully it'll convince Muppet Maunder to read it and see if helps him.
"I do not have to forgive my enemies, I have had them all shot." — Ramón Maria Narváez (1800-68). "I don't need to shoot my enemies, I don't have any." - Me (2012).
-
If only there was some sort of site where people could write articles on exactly this issue[^]! ;P
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
I am humbled and ashamed. And have just found an endless opportunity for way, way more procrastination.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
There is a way that you could do this, but it would be much more trouble than it was worth, and it would definitely open up a whole world of hurt. Effectively, what would need to be implemented is an IL rewriter to manage and rewrite the chain internally. Then you could create a fluid interface that would need to be recognised as the item that needs rewriting.
*pre-emptive celebratory nipple tassle jiggle* - Sean Ewington
"Mind bleach! Send me mind bleach!" - Nagy Vilmos
CodeStash - Online Snippet Management | My blog | MoXAML PowerToys | Mole 2010 - debugging made easier
I respect a man who prefers power drills and small explosives where others would wimp out and use tweezers. :thumbsup:
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
Out of curiosity, what would you do in the
else
section of such a call?Else? There is no else. Just blindly plow on!
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
I respect a man who prefers power drills and small explosives where others would wimp out and use tweezers. :thumbsup:
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
When I get the chance, I may just have a go at it. Need some free time first.
*pre-emptive celebratory nipple tassle jiggle* - Sean Ewington
"Mind bleach! Send me mind bleach!" - Nagy Vilmos
CodeStash - Online Snippet Management | My blog | MoXAML PowerToys | Mole 2010 - debugging made easier
-
I am testing several depths of properties in an object to make sure they are safe before I call them:
Test.NotNull(myObject);
if (myObject != null)
{
Test.NotNull(myObject.MyProperty);
if (myObject.MyProperty != null)
Test.IsPositive(myObject.MyProperty.Id);
...
}I was thinking it would be really cool to be able to do
Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
but obviously if
myObject == null
then we have a runtime null ref error because, regardless of what the NotNull method returns as part of the chaining,myObject
is still null. So this got me thinking: You can doif (myObject != null && myObject.MyProperty != null)
because of short circuit boolean evaluation in C#, but I was wondering, with my fairly mainstream experience in languages, if there are languages out there that would allow chaining of methods with short circuit evaluation. Essentially you'd have to have the input parameter be resolved after the method was called in order to have the method be able to say "I don't need the input parameter, please just ignore it". Has anyone heard of this? Would it open up a World Of Pain when it comes to debugging? Would it be useful? Am I procrastinating? --- Update: and it turns out this leads into a great discussion of extension methods. See The Maybe Monad[^] and Chained null checks and the Maybe monad[^] for two ways of achieving this. Once you've done that, debate the correctness of extension methods that are able by design to operate on a null references. I will be over there looking for new, shiny, distracting things.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
The first code block doesn't make any sense to me but this line
var result = Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
can be represented like this, can't you?
var result = (myObject == null ? false: myObject.MyProperty == null ? false : IsPositive(myObject.MyProperty.Id);
Just bouncing off an idea :) P.S. You can do it much simpler by using exceptions, I believe Cheers
-
You could just toss a :thumbsup: in place of a 5 vote.
"I've seen more information on a frickin' sticky note!" - Dave Kreskowiak
-
I am testing several depths of properties in an object to make sure they are safe before I call them:
Test.NotNull(myObject);
if (myObject != null)
{
Test.NotNull(myObject.MyProperty);
if (myObject.MyProperty != null)
Test.IsPositive(myObject.MyProperty.Id);
...
}I was thinking it would be really cool to be able to do
Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
but obviously if
myObject == null
then we have a runtime null ref error because, regardless of what the NotNull method returns as part of the chaining,myObject
is still null. So this got me thinking: You can doif (myObject != null && myObject.MyProperty != null)
because of short circuit boolean evaluation in C#, but I was wondering, with my fairly mainstream experience in languages, if there are languages out there that would allow chaining of methods with short circuit evaluation. Essentially you'd have to have the input parameter be resolved after the method was called in order to have the method be able to say "I don't need the input parameter, please just ignore it". Has anyone heard of this? Would it open up a World Of Pain when it comes to debugging? Would it be useful? Am I procrastinating? --- Update: and it turns out this leads into a great discussion of extension methods. See The Maybe Monad[^] and Chained null checks and the Maybe monad[^] for two ways of achieving this. Once you've done that, debate the correctness of extension methods that are able by design to operate on a null references. I will be over there looking for new, shiny, distracting things.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
Would the C# ?? operator help you?
Would that do what you want? It definitely saves typing.
http://msdn.microsoft.com/en-us/library/ms173224.aspx -
I am testing several depths of properties in an object to make sure they are safe before I call them:
Test.NotNull(myObject);
if (myObject != null)
{
Test.NotNull(myObject.MyProperty);
if (myObject.MyProperty != null)
Test.IsPositive(myObject.MyProperty.Id);
...
}I was thinking it would be really cool to be able to do
Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
but obviously if
myObject == null
then we have a runtime null ref error because, regardless of what the NotNull method returns as part of the chaining,myObject
is still null. So this got me thinking: You can doif (myObject != null && myObject.MyProperty != null)
because of short circuit boolean evaluation in C#, but I was wondering, with my fairly mainstream experience in languages, if there are languages out there that would allow chaining of methods with short circuit evaluation. Essentially you'd have to have the input parameter be resolved after the method was called in order to have the method be able to say "I don't need the input parameter, please just ignore it". Has anyone heard of this? Would it open up a World Of Pain when it comes to debugging? Would it be useful? Am I procrastinating? --- Update: and it turns out this leads into a great discussion of extension methods. See The Maybe Monad[^] and Chained null checks and the Maybe monad[^] for two ways of achieving this. Once you've done that, debate the correctness of extension methods that are able by design to operate on a null references. I will be over there looking for new, shiny, distracting things.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
Not really an answer for the question you asked, but just a comment about error handling. A good strategy to avoid endless nested checks in error handling is to handle the opposite case first. So instead of writing
Test.NotNull(myObject);
if (myObject != null)
{
Test.NotNull(myObject.MyProperty);
if (myObject.MyProperty != null)
Test.IsPositive(myObject.MyProperty.Id);
...
}we would have
Test.NotNull(myObject);
if (myObject == null)
return;Test.NotNull(myObject.MyProperty)
if (myObject.MyProperty == null)
return;Test.IsPositive(myObject.MyProperty.Id);
...
Interested in Machine Learning in .NET? Check the Accord.NET Framework. See also Haar-feature Object Detection (With The Viola-Jones Framework) in C#
-
I am testing several depths of properties in an object to make sure they are safe before I call them:
Test.NotNull(myObject);
if (myObject != null)
{
Test.NotNull(myObject.MyProperty);
if (myObject.MyProperty != null)
Test.IsPositive(myObject.MyProperty.Id);
...
}I was thinking it would be really cool to be able to do
Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
but obviously if
myObject == null
then we have a runtime null ref error because, regardless of what the NotNull method returns as part of the chaining,myObject
is still null. So this got me thinking: You can doif (myObject != null && myObject.MyProperty != null)
because of short circuit boolean evaluation in C#, but I was wondering, with my fairly mainstream experience in languages, if there are languages out there that would allow chaining of methods with short circuit evaluation. Essentially you'd have to have the input parameter be resolved after the method was called in order to have the method be able to say "I don't need the input parameter, please just ignore it". Has anyone heard of this? Would it open up a World Of Pain when it comes to debugging? Would it be useful? Am I procrastinating? --- Update: and it turns out this leads into a great discussion of extension methods. See The Maybe Monad[^] and Chained null checks and the Maybe monad[^] for two ways of achieving this. Once you've done that, debate the correctness of extension methods that are able by design to operate on a null references. I will be over there looking for new, shiny, distracting things.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
Chris Maunder wrote:
I was thinking it would be really cool to be able to do
Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
You can do that with extension methods! Just saying! ;)
My programming get away... The Blog... Taking over the world since 1371!
-
I am testing several depths of properties in an object to make sure they are safe before I call them:
Test.NotNull(myObject);
if (myObject != null)
{
Test.NotNull(myObject.MyProperty);
if (myObject.MyProperty != null)
Test.IsPositive(myObject.MyProperty.Id);
...
}I was thinking it would be really cool to be able to do
Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
but obviously if
myObject == null
then we have a runtime null ref error because, regardless of what the NotNull method returns as part of the chaining,myObject
is still null. So this got me thinking: You can doif (myObject != null && myObject.MyProperty != null)
because of short circuit boolean evaluation in C#, but I was wondering, with my fairly mainstream experience in languages, if there are languages out there that would allow chaining of methods with short circuit evaluation. Essentially you'd have to have the input parameter be resolved after the method was called in order to have the method be able to say "I don't need the input parameter, please just ignore it". Has anyone heard of this? Would it open up a World Of Pain when it comes to debugging? Would it be useful? Am I procrastinating? --- Update: and it turns out this leads into a great discussion of extension methods. See The Maybe Monad[^] and Chained null checks and the Maybe monad[^] for two ways of achieving this. Once you've done that, debate the correctness of extension methods that are able by design to operate on a null references. I will be over there looking for new, shiny, distracting things.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
Chris Maunder wrote:
So this got me thinking: You can do
if (myObject != null && myObject.MyProperty != null)
because of short circuit boolean evaluation in C#, but I was wondering, with my fairly mainstream experience in languages, if there are languages out there that would allow chaining of methods with short circuit evaluation.
Well, I find myself doing a lot of those kind of checks and it would save me a lot of time and potential bugs if there was such a language. But now you have just stimulated me to think about a general purpose solution in C#. Maybe if I find something I'll post it on tips and tricks.
To alcohol! The cause of, and solution to, all of life's problems - Homer Simpson ---- Our heads are round so our thoughts can change direction - Francis Picabia
-
Not really an answer for the question you asked, but just a comment about error handling. A good strategy to avoid endless nested checks in error handling is to handle the opposite case first. So instead of writing
Test.NotNull(myObject);
if (myObject != null)
{
Test.NotNull(myObject.MyProperty);
if (myObject.MyProperty != null)
Test.IsPositive(myObject.MyProperty.Id);
...
}we would have
Test.NotNull(myObject);
if (myObject == null)
return;Test.NotNull(myObject.MyProperty)
if (myObject.MyProperty == null)
return;Test.IsPositive(myObject.MyProperty.Id);
...
Interested in Machine Learning in .NET? Check the Accord.NET Framework. See also Haar-feature Object Detection (With The Viola-Jones Framework) in C#
Not sure how that counts as handling the opposite case first, but I see what you mean and I do do that, though I do try and have only 2 exit points in a routine: 1 at the top when input fails, and the return at the end. Hence my thought that it would be nice having a single chained line at the top. All good discussion though. I love it.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP