Re: Some notes on C# 3.0 (was RE: [DOTNET-CX] How to overload == for System.Double)
Sebastien Lorion <[email protected]> Sun, 4 Feb 2007 16:09:49 -0500
| Newsgroups | gmane.comp.windows.devel.dotnet.cx |
|---|---|
| Message-ID | <[email protected]> |
"Even if they are syntactical [...]" "they" refers to extension methods. Sorry, just saw the possible confusion. Sébastien www.sebastienlorion.com > -----Original Message----- > From: Sebastien Lorion [mailto:[email protected]] > Sent: Sunday, February 04, 2007 4:07 PM > To: 'Discussion relating to the specifics of the C# and Managed C++ > languages' > Subject: RE: [DOTNET-CX] Some notes on C# 3.0 (was RE: [DOTNET-CX] How > to overload == for System.Double) > > I think one big difference between extension methods and the rest of > new features is that they have a big impact on the *public* surface of > an API. The other features are mere convenience or more powerful > functional-like capabilities. Even if they are syntactical sugar for > the compiler, they are not for the developer and the architect. This is > in addition to other issues you and others have mentionned (versioning, > method name/signature collisions, etc.). > > Another thing is also the "side-effect" on intellisense. I for one do > not wish to see a bazillion methods on every single IEnumerable > variable I use. It makes the IDE slower and makes it harder to spot the > one method I am looking for. This is akin to VB.NET showing static > members on instance variables. Very annoying. > > Sébastien > www.sebastienlorion.com > > > > -----Original Message----- > > From: Discussion relating to the specifics of the C# and Managed C++ > > languages [mailto:[email protected]] On Behalf Of Bart De > > Smet [MVP] > > Sent: Sunday, February 04, 2007 3:18 PM > > To: [email protected] > > Subject: Re: [DOTNET-CX] Some notes on C# 3.0 (was RE: [DOTNET-CX] > How > > to overload == for System.Double) > > > > For what it's worth, a little overview: > > > > * Local Type Inference is for the most part syntactical sugar (var x > = > > abc; > > becomes - pseudocoded - typeof(abc) x = abc;) although it's a > > requirement to > > deal with anonymous types (needed for projections in the LINQ camp). > > * Object initializers are for 100 percent syntactical sugar and can > be > > replaced with a series of setter calls or field assignments (if we do > > not > > put anonymous types in the object initialize camp). > > * Collection initializers are for 100 percent syntactical sugar and > can > > be > > replaced with calls to an Add method. > > * Extension methods are 100 percent syntactical sugar and can be > > replaced > > with static method calls. It doesn't break encapsulation in any sense > > and > > isn't to be compared with C++'s friends (if anyone would think that > > way). > > For possible issues around this, take a look at > > > http://community.bartdesmet.net/blogs/bart/archive/2006/12/10/C_2300_- > > 3.0-Ex > > tension-Method-Versioning-Troubles-_2D00_-Some-thoughts-and-random- > > ideas.asp > > x too (cf " might require some rethinking is how extension methods > get > > imported into the current scope" - Fabian). > > * Lambda expressions are a more difficult thing as Fabian mentions > > since > > these allow (in collab with other language elements) expression tree > > generation for run-time evaluation and translation. > > * Anonymous types and automatic properties are also in the camp of > > syntax > > and could be seen as "auto-inserted compiled code snippets with > > substitutions". > > > > I guess it all depends on personal taste; for some individuals things > > like > > lock, using and foreach in C# 1.0 could be seen as syntactical sugar > > for > > library functionality; in C# 2.0 the stuff around iterators is a far > > more > > complex piece of syntactical sugar that performs much more code > > generation > > than some might think (one keyword "yield" results in a massive > amount > > of > > code generation); in C# 3.0 the expression tree stuff is on that same > > level > > while other features are much simpler substitution patterns with a > > few[C#]:few[MSIL] mapping scheme. You might argue that the way of > > thinking > > might be decisive to classify stuff in the syntactical sugar camp or > > not; > > whether you think implementation-driven (implicitly mapping on the > > runtime, > > MSIL, stack-based evaluation, processor instruction generating > > statement > > sequences, whatever is in a name) or results-driven (which LINQ > syntax > > is > > clearly a good example of). > > > > -Bart > > > > -----Original Message----- > > From: Discussion relating to the specifics of the C# and Managed C++ > > languages [mailto:[email protected]] On Behalf Of Fabian > > Schmied > > Sent: zondag 4 februari 2007 19:57 > > To: [email protected] > > Subject: Re: [DOTNET-CX] Some notes on C# 3.0 (was RE: [DOTNET-CX] > How > > to > > overload == for System.Double) > > > > > For the most part, I agree. My comments were mostly about > extension > > > methods; which aren't "sugar". > > [...] > > > There's nothing in 2.0 > > > that allows you to do what extension methods allow you to do in 3.0. > > > > Hm, as I see it, extension methods actually are syntactic sugar, much > > more so than lambda expressions are, for example. (After all, lambda > > expressions enable expression trees to be generated.) > > > > An extension method is an ordinary static method (of a class), for > > which the compiler allows you to specify the first argument before > the > > method name instead of after it at the call site. Where exactly do > you > > see the relationship with C++ nonmember functions? > > > > For illustration, with the following class declaration (syntax from > > memory): > > > > public static class ExtensionMethods { > > public static void Print<T>(this IEnumerable<T> collection) { > > foreach (T t in collection) { > > Console.WriteLine(t); > > } > > } > > } > > > > You can either call Print traditionally: > > > > string[] items = new string[] {"one", "two", "three"}; > > ExtensionMethods.Print(items); > > > > Or in this new way: > > string[] items = new string[] {"one", "two", "three"}; > > items.Print(); > > > > Since the latter is just a "shortcut" for the former achieved with an > > additional compiler lookup step, this for me is syntactic sugar. > (Nice > > one, actually, I've been wishing for that for a long time. The only > > thing that I think might require some rethinking is how extension > > methods get imported into the current scope.) > > > > Fabian > > > > =================================== > > This list is hosted by DevelopMentorR http://www.develop.com > > > > View archives and manage your subscription(s) at > > http://discuss.develop.com > > > > =================================== > > This list is hosted by DevelopMentor. http://www.develop.com > > > > View archives and manage your subscription(s) at > > http://discuss.develop.com =================================== This list is hosted by DevelopMentor® http://www.develop.com View archives and manage your subscription(s) at http://discuss.develop.com