Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. C# 4.0

C# 4.0

Scheduled Pinned Locked Moved The Lounge
csharpquestiondiscussionannouncement
233 Posts 75 Posters 427 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J James Lonero

    Interesting. I thought that C# originally was to be more OO than C++. Even in C++, you can write a completely procedural language type program (the C language). Maybe, Microsoft, in their zeal to make it easier to write software, is turning C# into an all in one language where you can get a job done any way you want. Maybe, at some later date, the keyword class will not be deprecated (not a first class item). Already, the anonymous type and var keyword are reducing the OO aspect of the language. Then, maybe, the hardcore OO engineers will move to Java.

    P Offline
    P Offline
    Pawel Krakowiak
    wrote on last edited by
    #172

    I think that the extension methods resemble more of a dynamic language features rather than procedural programming. You still need to have an object instance to call on such method and they are created for only the particular type. So an extension method added to the String class cannot be called from anything that is not a string. I think Microsoft is looking for a more dynamic language and extension methods work a little like JavaScript where you can attach new methods and properties to an existing object, but in C# it is still static and strong typing is preserved. I know you people whine about the fact that using the extension methods I don't inherit from the said class... Sometimes you want to only add a single method, perhaps it's laziness (not good). Good thing is that in order to make your extension methods work you must put the using keyword in the file where you plan to use them. Moreover - extension method don't just float there, they themselves must be contained in a static class. So what is the difference between creating a utility class with static methods like you would do in C# 2.0 and creating a static class with extension methods in C# 3.0? In the latter case you get cleaner syntax, being able to call the methods on the object directly, rather than passing it to a utility class method to get the same result. All in all, I understand the concerns, but I just couldn't resist the productivity boost it gave me the first time I saw extension methods.

    J 1 Reply Last reply
    0
    • J Jon Rista

      Perhapse that should be worded "can't" know the type...as in the case of anonymous types. Its easy enough to debug and find out a type you don't know. Var has its uses, but like almost any language feature, it can be missused. I think rather than restricting its use, though, better educating our programmers and instilling good practices is the first thing we should try. ;)

      J Offline
      J Offline
      James Lonero
      wrote on last edited by
      #173

      Jon, you can educate the programmers until you're blue in the face. But, when crunch time comes and all hell breaks loose, then we all take the quick and easy way out. Once you get used to using var (as with any shortcut), you'll continue using it. Usually, the best way to prevent using it (in a company or an organization) is to specifically disallow it in the coding standards and check for it in the code reviews.

      1 Reply Last reply
      0
      • P Pawel Krakowiak

        I think that the extension methods resemble more of a dynamic language features rather than procedural programming. You still need to have an object instance to call on such method and they are created for only the particular type. So an extension method added to the String class cannot be called from anything that is not a string. I think Microsoft is looking for a more dynamic language and extension methods work a little like JavaScript where you can attach new methods and properties to an existing object, but in C# it is still static and strong typing is preserved. I know you people whine about the fact that using the extension methods I don't inherit from the said class... Sometimes you want to only add a single method, perhaps it's laziness (not good). Good thing is that in order to make your extension methods work you must put the using keyword in the file where you plan to use them. Moreover - extension method don't just float there, they themselves must be contained in a static class. So what is the difference between creating a utility class with static methods like you would do in C# 2.0 and creating a static class with extension methods in C# 3.0? In the latter case you get cleaner syntax, being able to call the methods on the object directly, rather than passing it to a utility class method to get the same result. All in all, I understand the concerns, but I just couldn't resist the productivity boost it gave me the first time I saw extension methods.

        J Offline
        J Offline
        Jon Rista
        wrote on last edited by
        #174

        Agreed, extension methods arn't really procedural programming, but they arn't object oriented either. They DO definitely have a place, and DO definitely provide useful value when used properly. Same goes for the var keyword...it has its uses, and considering that it is local-scoped, the range of missuse of var is very, very limited. I used to be a hard-core, object-oriented purist. It was only when I finally let go if my bias that I realized the freedom one can have when you take full and proper advantage of a language like C#. Correctly used, C# is probably the most powerful, effective language on the planet for efficiently providing solutions to business problems...and that, ultimately, is what we programmers are here for...providing solutions.

        1 Reply Last reply
        0
        • J James Lonero

          Interesting. I thought that C# originally was to be more OO than C++. Even in C++, you can write a completely procedural language type program (the C language). Maybe, Microsoft, in their zeal to make it easier to write software, is turning C# into an all in one language where you can get a job done any way you want. Maybe, at some later date, the keyword class will not be deprecated (not a first class item). Already, the anonymous type and var keyword are reducing the OO aspect of the language. Then, maybe, the hardcore OO engineers will move to Java.

          J Offline
          J Offline
          Jon Rista
          wrote on last edited by
          #175

          C# is what I call a progressive language. It started out in a very simple, Java-like form in v1.0. But it has continually evolved into a richer, stronger, more expressive language that has only served to do one thing: Improve my productivity. Hard-core OO programming is a very limiting form of software engineering. Objects don't solve everything in the simplest way...on the contrary, rich object models with full inheritance and associative relationships can get in the way of providing a simple, effective, easily maintained solution. You have to use the right tool for the job, and objects are most assuredly NOT the right tool for every job. I for one am extremely grateful that Microsoft did not allow C# to stagnate like Sun allowed Java to. I use C# for what it is...a progressive, evolving language that has an EXTENSIVE amount of analysis and design behind it to ensure that features that are added provide benefit...not detriment. The end result, IMO, is an extremely powerful, expressive, flexible language that allows me to quickly solve problems without always having to resort to a complex OO mechanism. Sometimes, an enumerable collection of simple structures (tuples say), is all one needs to get the job done.

          P 1 Reply Last reply
          0
          • J Jon Rista

            Perhapse this (.NET 3.5 IEnumerable extensions): int[] supportedValues = new int[] {3,4,5}; int x = 4; if (supportedValues.Any(v => v == x)) { // Do something }

            S Offline
            S Offline
            SlingBlade
            wrote on last edited by
            #176

            The idea is so good they already implemented it in 3.5! ;P Perhaps I should stop using 2.0. I played with 3.5 briefly to check out WPF and Linq and didn't particularly see much use for them so I decided to stay away because of the performance drawbacks that came with WPF and didn't want to be tempted to use it. I missed the IEnumerable extensions and probably many more features that could come in handy. Am I the only one that WPF runs like molasses for? If not are there any other features to stay away from in order to perform decent on lowend and older machines? P.S. - Thanks for the Line Counter add-in! I've been using it for a couple months now.

            modified on Friday, October 3, 2008 2:30 AM

            J 1 Reply Last reply
            0
            • J Jon Rista

              I think what your asking for can be fairly closely achieved already in C# 3.0..its just slightly more verbose: int[] tupleFunc() { double w, h, d; // ... return new[] { w, h, d }; } int[] tuple = tupleFunc();

              J Offline
              J Offline
              Jon Rista
              wrote on last edited by
              #177

              On the flip side, native tuples in C# would be nice: public [int,int] MinMax(IEnumerable numbers) { int min, max; // Compute min and max return tuple[min,max]; } tuple[int,int] result = MinMax(new[] { 1, 2, 3, 5, 8, 13 }); int first = result[0]; A more complex example with an "anonymous" tuple might be: public [int,string,string,DateTime] TupleFunc() { return tuple[1,"String1","String2",DateTime.Now]; } tuple result = TupleFunc(); int num = result[0]; string first = result[1]; //...

              1 Reply Last reply
              0
              • J Jamie Nordmeyer

                So now that C# 4.0 is being talked about, I was wondering what people thought would be good additions to the language. Sorry if this is a repost, but I went through several pages, and didn't see anything, so... What I'd frankly love to see would be tuples. Rather than having to use multiple 'out' parameters, you'd just return multiple values:

                public int,int MinMax(int[] numbers)
                {
                int min, max;
                // Code to calculate min/max

                return min, max;
                }

                What do you think? What would be good for the next version?

                Kyosa Jamie Nordmeyer - Taekwondo Yi (2nd) Dan Portland, Oregon, USA

                R Offline
                R Offline
                rcollina
                wrote on last edited by
                #178

                The ability to include directly MSIL in code. Not strictly necessary but I'd love to be able to. Be it for method bodies or to describe MSIL streams (anyone using Emit knows what I'm talking about). Contracts. Oh they would be so nice :)

                1 Reply Last reply
                0
                • J Jamie Nordmeyer

                  So now that C# 4.0 is being talked about, I was wondering what people thought would be good additions to the language. Sorry if this is a repost, but I went through several pages, and didn't see anything, so... What I'd frankly love to see would be tuples. Rather than having to use multiple 'out' parameters, you'd just return multiple values:

                  public int,int MinMax(int[] numbers)
                  {
                  int min, max;
                  // Code to calculate min/max

                  return min, max;
                  }

                  What do you think? What would be good for the next version?

                  Kyosa Jamie Nordmeyer - Taekwondo Yi (2nd) Dan Portland, Oregon, USA

                  A Offline
                  A Offline
                  Anastasiosyal
                  wrote on last edited by
                  #179

                  Namely i'd like to see the following: 1. Implementing Interfaces by delegation to fields 2. Anonymous type return values 3. Some Duck-typing or Structural Subtyping support 4. Safe Null Dereferencing Operator as someone already mentioned (eg) Customer?.Orders?.Last?.Address I have expanded more on this some time ago here: http://anastasiosyal.com/archive/2008/07/19/4-features-for-c-4.0.aspx

                  P 1 Reply Last reply
                  0
                  • J Jamie Nordmeyer

                    I saw someone comment on that on another forum. Basically, you'd have something like this (using his sample syntax):

                    int? x = Company?.Person["Bob"]?.Age;

                    If Company or Company.Person["Bob"] were null, then x would be set to null, rather than getting an exception. I likes.

                    Kyosa Jamie Nordmeyer - Taekwondo Yi (2nd) Dan Portland, Oregon, USA

                    C Offline
                    C Offline
                    chaiguy1337
                    wrote on last edited by
                    #180

                    Lol I just realized this morning as I got up how dumb that was of me last night. You didn't forget anything--null would of course be the default, that's the whole point. :P "?? null" is redundant. :doh:

                    “Time and space can be a bitch.” –Gushie, Quantum Leap {o,o}.oO(   Check out my blog!   ) |)””’)                piHole.org -”-”-

                    1 Reply Last reply
                    0
                    • C chaiguy1337

                      Jamie Nordmeyer wrote:

                      I saw someone comment on that on another forum.

                      Daniel Grunwald, TheCodeKing and myself came up with that here[^]. You're missing the final part tho, which is a ?? operator to act as the "default": int? x = Company?.Person["Bob"]?.Age ?? null; Of course setting null as the "default default" would also work and be handy.

                      “Time and space can be a bitch.” –Gushie, Quantum Leap {o,o}.oO(   Check out my blog!   ) |)””’)                piHole.org -”-”-

                      J Offline
                      J Offline
                      Jamie Nordmeyer
                      wrote on last edited by
                      #181

                      Actually, the posting I saw wasn't on CodeProject. It may still have been yours, but it wasn't here. Either way, it's a fantastic idea, and I really like it!

                      Kyosa Jamie Nordmeyer - Taekwondo Yi (2nd) Dan Portland, Oregon, USA

                      C 1 Reply Last reply
                      0
                      • J Jamie Nordmeyer

                        Actually, the posting I saw wasn't on CodeProject. It may still have been yours, but it wasn't here. Either way, it's a fantastic idea, and I really like it!

                        Kyosa Jamie Nordmeyer - Taekwondo Yi (2nd) Dan Portland, Oregon, USA

                        C Offline
                        C Offline
                        chaiguy1337
                        wrote on last edited by
                        #182

                        Wasn't likely mine, then--that's the only place I remember discussing it; but it could have been one of the other guys. On the other hand it could have been someone else entirely, which only goes to show it must be a good idea if people are coming up with it independently! If you do find the link, let me know; it would be interesting to read what other people suggested. It would definitely be nice to have in an upcoming version of C#.

                        “Time and space can be a bitch.” –Gushie, Quantum Leap {o,o}.oO(   Check out my blog!   ) |)””’)                piHole.org -”-”-

                        1 Reply Last reply
                        0
                        • J Jon Rista

                          Perhapse that should be worded "can't" know the type...as in the case of anonymous types. Its easy enough to debug and find out a type you don't know. Var has its uses, but like almost any language feature, it can be missused. I think rather than restricting its use, though, better educating our programmers and instilling good practices is the first thing we should try. ;)

                          P Offline
                          P Offline
                          PIEBALDconsult
                          wrote on last edited by
                          #183

                          Jon Rista wrote:

                          should be worded "can't"

                          Yes, but for me they're pretty much equivalent; if I can know it I do know it. Unfortuntely there are some who can know it but are too darn lazy to find out.

                          J 1 Reply Last reply
                          0
                          • J Jon Rista

                            I think what your asking for can be fairly closely achieved already in C# 3.0..its just slightly more verbose: int[] tupleFunc() { double w, h, d; // ... return new[] { w, h, d }; } int[] tuple = tupleFunc();

                            S Offline
                            S Offline
                            Shog9 0
                            wrote on last edited by
                            #184

                            Jon Rista wrote:

                            int[] tuple = tupleFunc();

                            But what i really want is to avoid having to unpack the array on the callee side of things.

                            ----

                            You're right. These facts that you've laid out totally contradict the wild ramblings that I pulled off the back of cornflakes packets.

                            1 Reply Last reply
                            0
                            • R Rei Miyasaka

                              Static verification would be awesome. Contracts[^] would be nice too if they could get some of those features in without making too much of a mess. For instance, Spec# will throw a compile-time error (and squiggly underline in Visual Studio) with this code:

                              public float Divide(float x, float y)
                              {
                              return x / y;
                              }

                              But this would be valid:

                              public float Divide(float x, float y)
                              requires y != 0
                              {
                              return x / y;
                              }

                              As would this:

                              public float Divide(float x, float y)
                              {
                              if(y == 0)
                              throw new ArgumentException("y");
                              return x / y;
                              }

                              J Offline
                              J Offline
                              Judah Gabriel Himango
                              wrote on last edited by
                              #185

                              I wholly agree. Contracts will help us write less buggy code, which should be a primary focus of new C# features.

                              Tech, life, family, faith: Give me a visit. I'm currently blogging about: Feelings-Based Morality of the Secular World The apostle Paul, modernly speaking: Epistles of Paul Judah Himango

                              1 Reply Last reply
                              0
                              • J Jon Rista

                                They absolutely do! Look at IEnumerable...EVERY type that implements IEnumerable DOES INDEED get the full functionality of all extension methods written for IEnumerable (so long as the proper using statement(s) are included). You don't have to "implement" the extension methods on each class that implements IEnumerable...the extension methods absolutely do add new functionality without you having to do any extra implementation. And that functionality is accessed through class INSTANCES...not static methods or utility types. You anti-progressive types drive me nuts sometimes...get off your high horse and USE the tools at your disposal. You might find that you actually like them.

                                P Offline
                                P Offline
                                PIEBALDconsult
                                wrote on last edited by
                                #186

                                Jon Rista wrote:

                                anti-progressive types

                                No, I'm a pedantic type! I do use one or two Extension Methods I've written. I know what Extension Methods do, and "adding functionality to classes" isn't it. They simply masquerade as class members. They are still just static methods and can be used as such. They have absolutely zero effect on the class involved. Any benefits (over classic static usage) they offer are purely superficial. I'm not saying they don't work. I'm not saying that the static methods that implement them aren't useful. I (and I'm not the only one) think that having a static method look like a class method is a bad idea; they seem to break orthogonality for one thing. When I see a snippet of code posted here or elsewhere (where Intellisense isn't involved) I can't tell one from the other. Other than that, I don't like the implementation; the change to the syntax was unnecessary, the developer should be allowed to put the attribute on the method directly.

                                1 Reply Last reply
                                0
                                • P Pawel Krakowiak

                                  PIEBALDconsult wrote:

                                  They do nothing of the sort!

                                  string lookingFor = "Wash";
                                  lookingFor.ToSqlLike(SqlLikePlacement.Front); // returns "Wash%"
                                  lookingFor.ToSqlLike(SqlLikePlacement.Middle); // returns "%Wash%"
                                  lookingFor.ToSqlLike(SqlLikePlacement.End); // returns "%Wash"

                                  I understand I missed something and the above code is possible without extension methods and without creation of a new class?

                                  P Offline
                                  P Offline
                                  PIEBALDconsult
                                  wrote on last edited by
                                  #187

                                  Bad example. How is that better than: lookingFor = "%" + lookingFor ; lookingFor = lookingFor + "%" ; lookingFor = "%" + lookingFor + "%" ; The standard way is much clearer (at least in this case).

                                  P 1 Reply Last reply
                                  0
                                  • J Jon Rista

                                    Who says object-orientation is the sole valid way to write code? Object-orientation can get in the way when something simpler would suffice to get the job done. Extension methods allow you to add a great deal of expressiveness to your code, extend base types you don't have direct control of to provide a cleaner API, etc. etc. Whats with all the hostility towards useful language features and non-object-orientedness? Objects don't solve every problem. Portability? Where are you going to "port" a C# or VB.NET app to...they only run on the .NET platform anyway. Use the features for what they are. As a programmer, your job is to provide solutions to business problems in the most effective, efficient, maintainable way possible...don't get so hung up on all the "rules" and "regulations" of OOP...objects arn't the only option.

                                    S Offline
                                    S Offline
                                    Sunny Ahuwanya
                                    wrote on last edited by
                                    #188

                                    Jon Rista wrote:

                                    Portability? Where are you going to "port" a C# or VB.NET app to...they only run on the .NET platform anyway.

                                    Wrong. Look up Portable.NET[^] and Mono[^] There are also other compilation techniques out there. See IL2CPU on Cosmos[^] and Bartok used for the Singularity project.[^] I don't understand why programmers can't seem to separate C# from .NET. C# is a programming language with a syntax and rules. The C# life cycle of your project ends after you successfully compile your project. The framework you are using then executes the compiled binaries (and it doesn't have to be IL).

                                    Sunny Ahuwanya "The beauty of the desert is that it hides a well somewhere" -- Antoine de Saint Exupéry

                                    J 1 Reply Last reply
                                    0
                                    • J Jon Rista

                                      They absolutely do! Look at IEnumerable...EVERY type that implements IEnumerable DOES INDEED get the full functionality of all extension methods written for IEnumerable (so long as the proper using statement(s) are included). You don't have to "implement" the extension methods on each class that implements IEnumerable...the extension methods absolutely do add new functionality without you having to do any extra implementation. And that functionality is accessed through class INSTANCES...not static methods or utility types. You anti-progressive types drive me nuts sometimes...get off your high horse and USE the tools at your disposal. You might find that you actually like them.

                                      S Offline
                                      S Offline
                                      Sunny Ahuwanya
                                      wrote on last edited by
                                      #189

                                      Jon Rista wrote:

                                      And that functionality is accessed through class INSTANCES...not static methods or utility types.

                                      :omg: This is exactly why I said extension methods should come with a warning tag.

                                      Sunny Ahuwanya "The beauty of the desert is that it hides a well somewhere" -- Antoine de Saint Exupéry

                                      1 Reply Last reply
                                      0
                                      • P Pawel Krakowiak

                                        Personally I love the extensions methods for the collection types, like List[^]. They provide some very powerful and useful ways to manipulate data. It's a big productivity improvement, IMO.

                                        P Offline
                                        P Offline
                                        PIEBALDconsult
                                        wrote on last edited by
                                        #190

                                        But using them as Extension Methods is no more "powerful and useful" than using them as regular static methods. The "Extension Method-ness" isn't what makes the methods "powerful and useful".

                                        1 Reply Last reply
                                        0
                                        • J Jamie Nordmeyer

                                          So now that C# 4.0 is being talked about, I was wondering what people thought would be good additions to the language. Sorry if this is a repost, but I went through several pages, and didn't see anything, so... What I'd frankly love to see would be tuples. Rather than having to use multiple 'out' parameters, you'd just return multiple values:

                                          public int,int MinMax(int[] numbers)
                                          {
                                          int min, max;
                                          // Code to calculate min/max

                                          return min, max;
                                          }

                                          What do you think? What would be good for the next version?

                                          Kyosa Jamie Nordmeyer - Taekwondo Yi (2nd) Dan Portland, Oregon, USA

                                          K Offline
                                          K Offline
                                          Kevin McFarlane
                                          wrote on last edited by
                                          #191

                                          A lot of the stuff from Spec#. At a minimum - preconditions, postconditions and invariants.

                                          Kevin

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups