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. What Language Features Do You Miss In C#?

What Language Features Do You Miss In C#?

Scheduled Pinned Locked Moved The Lounge
csharpjavascriptcomquestiondiscussion
102 Posts 36 Posters 0 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.
  • P Paulo Zemek

    Hahahahaha. You didn't get it at all. Imagine that for some reason you don't know the T type at compile-time. You are in an event or something and you are receiving a valid value, but it is cast as object. How do you do a call to the generic class without knowing its generic type? In such case, it is up to you to do the cast, but you don't have the destination type at compile time. The solution in such situation is to use reflection or dynamic. I solve the problem having an untyped interface. That works very well for my classes, but not to already existing classes. Even if it is not a generic class situation, you can see that happening with database connections. You have SqlConnection, OracleConnection, SqlCommand, OracleCommand, SqlParameter, OracleParameter and so on. But you can use all of them al IDbConnection, IDbCommand and so on. So, you create a parameter using the command... you dont know if it is an OracleParameter or SqlParameter... but it is not important, as when you add a parameter to a command the driver do the cast for you. (Ok, it is a little stupid that you create the parameter and it is not added automatically... but I want to ilustrate a situation where you have a valid value [the parameter] but you don't have the valid type).

    S Offline
    S Offline
    Sentenryu
    wrote on last edited by
    #56

    if you know the interface you can always cast to IFoo. thanks to Covariance[^]

    I'm brazilian and english (well, human languages in general) aren't my best skill, so, sorry by my english. (if you want we can speak in C# or VB.Net =p) "Given the chance I'd rather work smart than work hard." - PHS241

    P 1 Reply Last reply
    0
    • S Steve Wellens

      sprintf sscanf

      Steve Wellens

      S Offline
      S Offline
      Sentenryu
      wrote on last edited by
      #57

      I don't know about sscanf, but String.Format() doesn't do the trick for when you need sprintf?

      I'm brazilian and english (well, human languages in general) aren't my best skill, so, sorry by my english. (if you want we can speak in C# or VB.Net =p) "Given the chance I'd rather work smart than work hard." - PHS241

      1 Reply Last reply
      0
      • T thrakazog

        My answer is always multiple inheritance. Times that I would use it are rare. But when those times come up man do I ever want that.

        Play my game Gravity: IOS[^], Android[^], Windows Phone 7[^]

        A Offline
        A Offline
        Alan Balkany
        wrote on last edited by
        #58

        I agree. Multiple inheritance can be an elegant, simple, effective solution to many design problems. It's left out because there are contrived cases where it produces complexity, but these are just bad programming.

        1 Reply Last reply
        0
        • S Sentenryu

          if you know the interface you can always cast to IFoo. thanks to Covariance[^]

          I'm brazilian and english (well, human languages in general) aren't my best skill, so, sorry by my english. (if you want we can speak in C# or VB.Net =p) "Given the chance I'd rather work smart than work hard." - PHS241

          P Offline
          P Offline
          Paulo Zemek
          wrote on last edited by
          #59

          That works for IEnumerable but not for IList (to show a limitation). In fact, if you need to give parameters to the Foo object (in the command case, you add a parameter to the command) it can at maximum be an "in T", so you can't use IFoo<object> Also, even "out T" will not work which structs. Try to get an IEnumerator<int> as an IEnumerator<object>. It does not work. But for such situation there is the non-generic that works in a more generic way... you can use an IEnumerator without a generic parameter. In such case there is such interface, but that's not always the case. And as a note... using IFoo<object> is contravariance, not covariance.

          1 Reply Last reply
          0
          • K Kent Sharkey

            Sure, it's on another discussion site[^], but that doesn't mean we can't also discuss it here. Personally, while it certainly doesn't fit in the "missing" category, I see them moving it closer and closer to a hybrid C#/JavaScript language with each new version.

            -------------- TTFN - Kent

            A Offline
            A Offline
            Alan Balkany
            wrote on last edited by
            #60

            The ability to look at a variable's memory location while in another part of the program. In C++, I sometimes use what I call the "Stakeout Debugging Pattern": I create a Watch expression on the address of a variable, so I can see how it changes while not in scope. (The debugger won't show variables not in scope). E.g. *(int *)0x12345678 But there's no way (that I know of) to do this in C#. This would help with debugging.

            Sander RosselS 1 Reply Last reply
            0
            • K Kent Sharkey

              Sure, it's on another discussion site[^], but that doesn't mean we can't also discuss it here. Personally, while it certainly doesn't fit in the "missing" category, I see them moving it closer and closer to a hybrid C#/JavaScript language with each new version.

              -------------- TTFN - Kent

              S Offline
              S Offline
              svella
              wrote on last edited by
              #61

              Gonna be controversial, but Checked Exceptions.

              1 Reply Last reply
              0
              • M Marc Clifton

                Multiple inheritance. Interfaces are useful as abstractions, but there are times I want to inherit concrete functionality from multiple classes. Marc

                Latest Article: C# and Ruby Classes: A Deep Dive
                My Blog

                P Offline
                P Offline
                Paulo Zemek
                wrote on last edited by
                #62

                I completely agree. Even if we can simulate multiple inheritance with interfaces and extension methods, well, extension methods are ugly, require a special using to be available and can't be virtual. So, multiple inheritance will be great. And if there are persons that use it incorrectly, well... there are persons that do all kinds of stupid things.

                1 Reply Last reply
                0
                • K Kent Sharkey

                  Sure, it's on another discussion site[^], but that doesn't mean we can't also discuss it here. Personally, while it certainly doesn't fit in the "missing" category, I see them moving it closer and closer to a hybrid C#/JavaScript language with each new version.

                  -------------- TTFN - Kent

                  J Offline
                  J Offline
                  Jasmine2501
                  wrote on last edited by
                  #63

                  THROWS, as an optional declaration. I would like the following... public void myfunction(int x) throws ArgumentException, OverflowException { } And, Java needs the other form of throws too, which I'd like to see in C# public void myfunction(int x) throws NONE { } ... for methods which can't throw exceptions.

                  P 1 Reply Last reply
                  0
                  • T Tim Schwallie

                    I believe that's been there since version 1.0

                    A Offline
                    A Offline
                    AspDotNetDev
                    wrote on last edited by
                    #64

                    Riiiiight...

                    Thou mewling ill-breeding pignut!

                    T 1 Reply Last reply
                    0
                    • S Single Step Debugger

                      This one is type dependent and not a language future but some class method. Same as Split() (very useful method by the way) or IsNullOrEmpty() for example.

                      There is only one Vera Farmiga and Salma Hayek is her prophet! Advertise here – minimum three posts per day are guaranteed.

                      A Offline
                      A Offline
                      AspDotNetDev
                      wrote on last edited by
                      #65

                      What does it matter that it's a framework implementation and not implemented by the C# specification? Just as long as it accomplishes the same thing.

                      Thou mewling ill-breeding pignut!

                      S 1 Reply Last reply
                      0
                      • K Kent Sharkey

                        Sure, it's on another discussion site[^], but that doesn't mean we can't also discuss it here. Personally, while it certainly doesn't fit in the "missing" category, I see them moving it closer and closer to a hybrid C#/JavaScript language with each new version.

                        -------------- TTFN - Kent

                        R Offline
                        R Offline
                        RafagaX
                        wrote on last edited by
                        #66

                        I miss that it's not Java... ;P

                        CEO at: - Rafaga Systems - Para Facturas - Modern Components for the moment...

                        1 Reply Last reply
                        0
                        • F Florian Rappl

                          I do not really agree, since case statements form a valid label and goto LABEL is a real goto. Why was goto brought to C (and therefore to C++, C#, ...) anyway? It is REALLY simple to implement goto in C (for transferring into assembler). Its jut a plain JMP. Labels can be transferred nearly 1-1, so having a goto the way it has been introduced to C makes sense. switch-case statements have just a list of JE statements, i.e. using goto is the way to use those labels outside of the usual flow. Here is how switch-case results in MSIL:

                          IL_0001: ldc.i4.5
                          IL_0002: stloc.0 // a
                          IL_0003: ldloc.0 // a
                          IL_0004: stloc.1 // CS$4$0000
                          IL_0005: ldloc.1 // CS$4$0000
                          IL_0006: switch (IL_0015, IL_0022)
                          IL_0013: br.s IL_002F
                          IL_0015: ldstr "Zero"
                          IL_001A: call LINQPad.Extensions.Dump
                          IL_001F: pop
                          IL_0020: br.s IL_003C
                          IL_0022: ldstr "Zero"
                          IL_0027: call LINQPad.Extensions.Dump
                          IL_002C: pop
                          IL_002D: br.s IL_003C
                          IL_002F: ldstr "Nothing"
                          IL_0034: call LINQPad.Extensions.Dump
                          IL_0039: pop
                          IL_003A: br.s IL_003C

                          The line IL_0006 will result in the list of JE statements. The following program was used to produce these lines of IL code:

                          void Main()
                          {
                          var a = 5;

                          switch(a)
                          {
                          	case 0:
                          		"Zero".Dump();
                          		break;
                          	case 1:
                          		"One".Dump();
                          		break;
                          	default:
                          		"Non-Zero".Dump();
                          		break;
                          }
                          

                          }

                          If you would now compare this to usual labels you would see that both are identical. It's really just a syntax thing that case statements start with case, hence since one has always to specify the full label, the case needs to be included for any goto call on those labels.

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

                          So?

                          F 1 Reply Last reply
                          0
                          • A AspDotNetDev

                            What does it matter that it's a framework implementation and not implemented by the C# specification? Just as long as it accomplishes the same thing.

                            Thou mewling ill-breeding pignut!

                            S Offline
                            S Offline
                            Single Step Debugger
                            wrote on last edited by
                            #68

                            The force is not as strong with the framework as it’s with the language itself. :-D

                            There is only one Vera Farmiga and Salma Hayek is her prophet! Advertise here – minimum three posts per day are guaranteed.

                            1 Reply Last reply
                            0
                            • A Alan Balkany

                              The ability to look at a variable's memory location while in another part of the program. In C++, I sometimes use what I call the "Stakeout Debugging Pattern": I create a Watch expression on the address of a variable, so I can see how it changes while not in scope. (The debugger won't show variables not in scope). E.g. *(int *)0x12345678 But there's no way (that I know of) to do this in C#. This would help with debugging.

                              Sander RosselS Offline
                              Sander RosselS Offline
                              Sander Rossel
                              wrote on last edited by
                              #69

                              Doesn't .NET constantly relocate variables to other memory locations? Which would mean you could watch an address, but if it changes that doesn't mean the variable you were watching is unreachable or out of scope. So what would you get out of it?

                              It's an OO world.

                              public class Naerling : Lazy<Person>{
                              public void DoWork(){ throw new NotImplementedException(); }
                              }

                              A 1 Reply Last reply
                              0
                              • Sander RosselS Sander Rossel

                                Doesn't .NET constantly relocate variables to other memory locations? Which would mean you could watch an address, but if it changes that doesn't mean the variable you were watching is unreachable or out of scope. So what would you get out of it?

                                It's an OO world.

                                public class Naerling : Lazy<Person>{
                                public void DoWork(){ throw new NotImplementedException(); }
                                }

                                A Offline
                                A Offline
                                Alan Balkany
                                wrote on last edited by
                                #70

                                You're right that garbage collection and relocation would invalidate the address, but this is only done when the application runs out of memory. Even better would be a way to watch a variable in another class, which would track these relocations. But that would require a more extensive change to the framework. Watching an address would be just about as useful, and is a more modest request.

                                T 1 Reply Last reply
                                0
                                • M Member 9063556

                                  Plugin support is always an issue with C#. You can't use User Controls inside a Console Application, which makes that coding needs to be done each class. C++ holds great support for adding plugins for extra code (.h files sepcifically are useful) but in the end, you can't blame Microsoft for their .NET approach to everything, The time of a CLI is dead (Except PowerShell, IMO)

                                  P Offline
                                  P Offline
                                  Paul Michalik
                                  wrote on last edited by
                                  #71

                                  This is the most exotic opinion I have heard lately...[]

                                  M 1 Reply Last reply
                                  0
                                  • K Kent Sharkey

                                    Sure, it's on another discussion site[^], but that doesn't mean we can't also discuss it here. Personally, while it certainly doesn't fit in the "missing" category, I see them moving it closer and closer to a hybrid C#/JavaScript language with each new version.

                                    -------------- TTFN - Kent

                                    N Offline
                                    N Offline
                                    Naoya Yamaguchi
                                    wrote on last edited by
                                    #72

                                    They could improve C# in threading. C# is still a bit clumsy around threading. A thread is provided as a class in the system.threading namespace. And yet a lock is part of the C# language itself. I would like a syntax like:

                                    Future f = async double square(double x){return x * x;}

                                    A variable should be synchronizable with the "synchronized" keyword so that only one thread can access it at a time, like:

                                    synchronized double Balance;

                                    1 Reply Last reply
                                    0
                                    • K Kent Sharkey

                                      Sure, it's on another discussion site[^], but that doesn't mean we can't also discuss it here. Personally, while it certainly doesn't fit in the "missing" category, I see them moving it closer and closer to a hybrid C#/JavaScript language with each new version.

                                      -------------- TTFN - Kent

                                      T Offline
                                      T Offline
                                      Thornik
                                      wrote on last edited by
                                      #73

                                      I wanna have multi-return: (a, b) = SplitComplexNumber(d);

                                      J 1 Reply Last reply
                                      0
                                      • P PIEBALDconsult

                                        So?

                                        F Offline
                                        F Offline
                                        Florian Rappl
                                        wrote on last edited by
                                        #74

                                        What you mean "So"? goto is just goto - so that statement that it's different is wrong.

                                        P 1 Reply Last reply
                                        0
                                        • F Florian Rappl

                                          What you mean "So"? goto is just goto - so that statement that it's different is wrong.

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

                                          The concept is different.

                                          F 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