c# Casting v As operator
-
For those using c#, what do you prefer? A.
SomeObject obj = (SomeObject) e;
or B.
SomeObject obj = e as SomeObject;
www.software-kinetics.co.uk Wear a hard hat it's under construction
As is for poor programmers. If you know that e always is SomeObject then e should be typed as such using some other method. Otherwise you always have to check the result of the as operation. So then you have the following two scenarios which must always be in case A or case B:
if(e is SomeObject){
SomeObject someObject = (SomeObject)e;
}or
SomeObject someobject = e as SomeObject;
if(someObject != null){}
But then in case by I always here the response ... but I know e is always SomeObject. Really then maybe it should be defined as such. The AS operator is designed solely to support developers that don't have a fundamental concept of type. After all, for all of the time I have seen the is operator used with a subsequent cast, checking for null after the AS is a white rhinoceros.
Need custom software developed? I do custom programming based primarily on MS tools with an emphasis on C# development and consulting. I also do Android Programming as I find it a refreshing break from the MS. "And they, since they Were not the one dead, turned to their affairs" -- Robert Frost
-
For those using c#, what do you prefer? A.
SomeObject obj = (SomeObject) e;
or B.
SomeObject obj = e as SomeObject;
www.software-kinetics.co.uk Wear a hard hat it's under construction
The first when I need the exception, the second when I need the null. Because face it, e is never what you need it to be.
FILETIME to time_t
| FoldWithUs! | sighist | WhoIncludes - Analyzing C++ include file hierarchy -
As is for poor programmers. If you know that e always is SomeObject then e should be typed as such using some other method. Otherwise you always have to check the result of the as operation. So then you have the following two scenarios which must always be in case A or case B:
if(e is SomeObject){
SomeObject someObject = (SomeObject)e;
}or
SomeObject someobject = e as SomeObject;
if(someObject != null){}
But then in case by I always here the response ... but I know e is always SomeObject. Really then maybe it should be defined as such. The AS operator is designed solely to support developers that don't have a fundamental concept of type. After all, for all of the time I have seen the is operator used with a subsequent cast, checking for null after the AS is a white rhinoceros.
Need custom software developed? I do custom programming based primarily on MS tools with an emphasis on C# development and consulting. I also do Android Programming as I find it a refreshing break from the MS. "And they, since they Were not the one dead, turned to their affairs" -- Robert Frost
Thanks Ennis - I'm a poor programmer then because I use
as
, rather than the double cast, which is doing the same work again. What happens internally withas
is that it checks to see if the variable is of the type, and if it is it returns a non-null pointer to that type. With theis
operator, you check to see if it is of the type and then you cast it - which still determines internally whether or not it belongs to that type (this is how it throws anInvalidTypeException
). In any case where you are using code-discovery, such as IoC, then theas
call is more efficient. [Edit]I should add that this relates to our plugin code where the client provides their own logic, and "forgets" to implement the appropriate interfaces.[/Edit]Forgive your enemies - it messes with their heads
My blog | My articles | MoXAML PowerToys | Mole 2010 - debugging made easier - my favourite utility
modified on Thursday, June 23, 2011 9:30 AM
-
Richard A. Dalton wrote:
Plug-in tpye code
I don't have such problems with plug-ins.
You have better clients than we do then. You tell them, you must implement this interface in order for this to work, and bam they completely fail to implement the interface.
Forgive your enemies - it messes with their heads
My blog | My articles | MoXAML PowerToys | Mole 2010 - debugging made easier - my favourite utility
-
The first when I need the exception, the second when I need the null. Because face it, e is never what you need it to be.
FILETIME to time_t
| FoldWithUs! | sighist | WhoIncludes - Analyzing C++ include file hierarchy -
Don't fancy seeing your code if you think b. looks like a great ape :rolleyes:
www.software-kinetics.co.uk Wear a hard hat it's under construction
Somebody didn't read the subject of the post.
Und wenn du lange in einen abgrund blickst, blickt der Abgrund auch in dich hinein.
-
PIEBALDconsult wrote:
what are you people doing?
SomeType obj = (SomeType)BloatedUglyUnreadableFrameworkFactory.CreateObject(someXMLStringThatIHopeWorksSometimesButNeverKnowForSure);
You've been reading java code on the throne again haven't you? :)
¡El diablo está en mis pantalones! ¡Mire, mire! SELECT * FROM User WHERE Clue > 0 0 rows returned Save an Orange - Use the VCF! Personal 3D projects Just Say No to Web 2 Point Blow
-
Somebody didn't read the subject of the post.
Und wenn du lange in einen abgrund blickst, blickt der Abgrund auch in dich hinein.
:wtf: are you going on about.
www.software-kinetics.co.uk Wear a hard hat it's under construction
-
I'd say more of a debate, but as we all know rules of the lounge, I'd say just go along with it and chill :)
www.software-kinetics.co.uk Wear a hard hat it's under construction
I seem to have upset some voters along the way. :-D
-
:wtf: are you going on about.
www.software-kinetics.co.uk Wear a hard hat it's under construction
Sahir seems to be comparing C# casts with a handler of equine animals.
-
-
Sahir seems to be comparing C# casts with a handler of equine animals.
:) Indeed, at this rate he's going to hit an exception that he may not like.
www.software-kinetics.co.uk Wear a hard hat it's under construction
-
For those using c#, what do you prefer? A.
SomeObject obj = (SomeObject) e;
or B.
SomeObject obj = e as SomeObject;
www.software-kinetics.co.uk Wear a hard hat it's under construction
I prefer directly throwing. :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
:wtf: are you going on about.
www.software-kinetics.co.uk Wear a hard hat it's under construction
Well in brief, if you are in the shower and drop the soap and there is an operator mentioned in the subject line around, there is a good chance he might be a hominid. I wouldn't advise you to try and pick up the soap.
Und wenn du lange in einen abgrund blickst, blickt der Abgrund auch in dich hinein.
-
Thanks Ennis - I'm a poor programmer then because I use
as
, rather than the double cast, which is doing the same work again. What happens internally withas
is that it checks to see if the variable is of the type, and if it is it returns a non-null pointer to that type. With theis
operator, you check to see if it is of the type and then you cast it - which still determines internally whether or not it belongs to that type (this is how it throws anInvalidTypeException
). In any case where you are using code-discovery, such as IoC, then theas
call is more efficient. [Edit]I should add that this relates to our plugin code where the client provides their own logic, and "forgets" to implement the appropriate interfaces.[/Edit]Forgive your enemies - it messes with their heads
My blog | My articles | MoXAML PowerToys | Mole 2010 - debugging made easier - my favourite utility
modified on Thursday, June 23, 2011 9:30 AM
Well a smart language like C# should provide the construct this way:
if (e is MyObject)
{
// here call MyObject methods on e
}:rolleyes:
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
As is for poor programmers. If you know that e always is SomeObject then e should be typed as such using some other method. Otherwise you always have to check the result of the as operation. So then you have the following two scenarios which must always be in case A or case B:
if(e is SomeObject){
SomeObject someObject = (SomeObject)e;
}or
SomeObject someobject = e as SomeObject;
if(someObject != null){}
But then in case by I always here the response ... but I know e is always SomeObject. Really then maybe it should be defined as such. The AS operator is designed solely to support developers that don't have a fundamental concept of type. After all, for all of the time I have seen the is operator used with a subsequent cast, checking for null after the AS is a white rhinoceros.
Need custom software developed? I do custom programming based primarily on MS tools with an emphasis on C# development and consulting. I also do Android Programming as I find it a refreshing break from the MS. "And they, since they Were not the one dead, turned to their affairs" -- Robert Frost
I use the (cast) only when I know 'e is always SomeObject'. Which is a rare case - think stuff like
(ThisClass)base.MemberwiseClone()
. Otherwise, I preferas
+ null check overis
+ cast. It looks cleaner to me, and is also more performant. 'a is T
' gets compiled to the same IL as '(a as T) != null
', sois
+ cast ends up casting twice (and last time I checked, the JIT was too dumb to optimize that). -
I use the (cast) only when I know 'e is always SomeObject'. Which is a rare case - think stuff like
(ThisClass)base.MemberwiseClone()
. Otherwise, I preferas
+ null check overis
+ cast. It looks cleaner to me, and is also more performant. 'a is T
' gets compiled to the same IL as '(a as T) != null
', sois
+ cast ends up casting twice (and last time I checked, the JIT was too dumb to optimize that).Like I said, my problem is that most developers that use AS do not subsequently check for null. The fact that the .NET framework is written stupidly is a completely other rant. (IMHO AS should use IS and not the other way around).
Need custom software developed? I do custom programming based primarily on MS tools with an emphasis on C# development and consulting. I also do Android Programming as I find it a refreshing break from the MS. "And they, since they Were not the one dead, turned to their affairs" -- Robert Frost
-
Like I said, my problem is that most developers that use AS do not subsequently check for null. The fact that the .NET framework is written stupidly is a completely other rant. (IMHO AS should use IS and not the other way around).
Need custom software developed? I do custom programming based primarily on MS tools with an emphasis on C# development and consulting. I also do Android Programming as I find it a refreshing break from the MS. "And they, since they Were not the one dead, turned to their affairs" -- Robert Frost
Ennis Ray Lynch, Jr. wrote:
AS should use IS and not the other way around
How that? 'a as B' should be compiled to 'a is B ? (B)a : null'? That would be horribly stupid. Consider how this works on the assembly level: 'is' is a function that takes an object and a type token, performs a type test, returns non-zero if successful, zero otherwise. 'as' is a function that takes an object and a type token, performs a type test, returns the object if successful, null otherwise. Given that objects are non-zero by definition, it makes perfect sense to use the same function for both, and that's exactly what .NET does. What's stupid is that the JIT optimizer is so dumb that this leads to a performance difference visible to the programmer. If the JIT could simply optimize away redundant casts, nobody would have to care what as/is/casts compile to.
-
Ennis Ray Lynch, Jr. wrote:
AS should use IS and not the other way around
How that? 'a as B' should be compiled to 'a is B ? (B)a : null'? That would be horribly stupid. Consider how this works on the assembly level: 'is' is a function that takes an object and a type token, performs a type test, returns non-zero if successful, zero otherwise. 'as' is a function that takes an object and a type token, performs a type test, returns the object if successful, null otherwise. Given that objects are non-zero by definition, it makes perfect sense to use the same function for both, and that's exactly what .NET does. What's stupid is that the JIT optimizer is so dumb that this leads to a performance difference visible to the programmer. If the JIT could simply optimize away redundant casts, nobody would have to care what as/is/casts compile to.
What do you think AS is doing now?
Need custom software developed? I do custom programming based primarily on MS tools with an emphasis on C# development and consulting. I also do Android Programming as I find it a refreshing break from the MS. "And they, since they Were not the one dead, turned to their affairs" -- Robert Frost
-
For those using c#, what do you prefer? A.
SomeObject obj = (SomeObject) e;
or B.
SomeObject obj = e as SomeObject;
www.software-kinetics.co.uk Wear a hard hat it's under construction
As others have probably pointed out (but I'm too lazy to read the rest of the thread), the two versions do different things. 'A' throws an
InvalidCastException
if the cast isn't possible. 'B' setsobj
tonull
if the cast doesn't work. Both are valid approaches, depending on the rest of your code.Software Zen:
delete this;