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. General Programming
  3. C#
  4. Diferences between null,close and dispose

Diferences between null,close and dispose

Scheduled Pinned Locked Moved C#
questiontutorial
11 Posts 5 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.
  • E Offline
    E Offline
    Enishi
    wrote on last edited by
    #1

    Ok heres a question its roaming my mind. Whats the difference doing for example. SqlConnection con= new SqlConnection(connection_string); con.close(); con.dispoe(); and con= null; AFAIK i think this. Close just clsoes the connection and can be opened again, dipose frees the resources so it cant be opened again, must declare again and null makes the GC get it faster. With this object i see it clearly but its the same for others? DataSet ds= new DataSet(); Lets take about datasets, if i do a ds.dispose() its completely erased? and what about if i do ds=null; whats will do if i return the dataset in a method and later i do a dispose or a null in the finally clausule. Ty for ur time.

    S T T E 4 Replies Last reply
    0
    • E Enishi

      Ok heres a question its roaming my mind. Whats the difference doing for example. SqlConnection con= new SqlConnection(connection_string); con.close(); con.dispoe(); and con= null; AFAIK i think this. Close just clsoes the connection and can be opened again, dipose frees the resources so it cant be opened again, must declare again and null makes the GC get it faster. With this object i see it clearly but its the same for others? DataSet ds= new DataSet(); Lets take about datasets, if i do a ds.dispose() its completely erased? and what about if i do ds=null; whats will do if i return the dataset in a method and later i do a dispose or a null in the finally clausule. Ty for ur time.

      S Offline
      S Offline
      S Senthil Kumar
      wrote on last edited by
      #2

      Not really. SqlConnection's Close and Dispose do the same thing, if you look at the code, Dispose calls Close. null doesn't necessarily make the GC get it faster, in general, the GC is intelligent enough to figure out that that object has no live references. The only place where setting to null is recommended is if that object is contained within a long living object. So the answer is 1. Close and Dispose do the same thing. It has nothing to do with GC. 2. Setting to null doesn't make the GC get it faster in most cases. Regards Senthil _____________________________ My Blog | My Articles | WinMacro

      1 Reply Last reply
      0
      • E Enishi

        Ok heres a question its roaming my mind. Whats the difference doing for example. SqlConnection con= new SqlConnection(connection_string); con.close(); con.dispoe(); and con= null; AFAIK i think this. Close just clsoes the connection and can be opened again, dipose frees the resources so it cant be opened again, must declare again and null makes the GC get it faster. With this object i see it clearly but its the same for others? DataSet ds= new DataSet(); Lets take about datasets, if i do a ds.dispose() its completely erased? and what about if i do ds=null; whats will do if i return the dataset in a method and later i do a dispose or a null in the finally clausule. Ty for ur time.

        T Offline
        T Offline
        turbochimp
        wrote on last edited by
        #3

        The previous post is not entirely correct. Close() and Dispose() do not do the same thing with respect to a SqlConnection. It is true that Dispose() will close the connection if the ConnectionState is Open, but the converse is not true: if Close() is called, the SqlConnection is not disposed, and your initial assertion is correct - the connection may be re-opened. In general, the following should ideally be true for disposable types (the concept of Close is not covered, since it doesn't really apply to the discussion, and may mean different things to different types - file streams, database connections, sockets etc.): 1. Dispose() should be responsible for cleaning up unmanaged resources and indicating to the GC that finalization is suppressed for the instance (suppressing finalization explicitly avoids the default two-pass collection of collectible objects). The value of Dispose() is that unmanaged resources can be reclaimed immediately (or nearly so), without waiting for the GC. Suppressing finalization for the object serves to streamline the garbage collection process so that it takes only one pass to reclaim the managed resources used by the object instead of two passes (one to finalize, one to reclaim). 2. Setting an object to null just drops a reference to the object, essentially setting it adrift in the (managed) heap until the GC executes and begins cleaning it up. There is no guarantee about when the resources for that object will be reclaimed. For more info, look here.[^] Hope this helps.

        The most exciting phrase to hear in science, the one that heralds the most discoveries, is not 'Eureka!' ('I found it!') but 'That's funny...’

        S 1 Reply Last reply
        0
        • E Enishi

          Ok heres a question its roaming my mind. Whats the difference doing for example. SqlConnection con= new SqlConnection(connection_string); con.close(); con.dispoe(); and con= null; AFAIK i think this. Close just clsoes the connection and can be opened again, dipose frees the resources so it cant be opened again, must declare again and null makes the GC get it faster. With this object i see it clearly but its the same for others? DataSet ds= new DataSet(); Lets take about datasets, if i do a ds.dispose() its completely erased? and what about if i do ds=null; whats will do if i return the dataset in a method and later i do a dispose or a null in the finally clausule. Ty for ur time.

          T Offline
          T Offline
          Tom Larsen
          wrote on last edited by
          #4

          The general rule of thumb is that anytime you call Dispose any unmanaged resources that were allocated are now unavailable so doing anything further with the object is risky. Since the object is kind of in an invalid state using the object beyond the Dispose. It should also be noted that Dispose can happen independant of Object.Finalize. Dispose is an interface so an object can deallocate resources and not meant as the general "death of the object". There is a whole side topic of the GC that should be discussed outside of the thread if you really care. My general practice is when I'm done with an object that has to manage limited resources, I call Dispose (I usually try to place this in a finally block) and then set it to null so if anyone "accidently" tries to reuse the object it will throw a NullReferenceException.

          1 Reply Last reply
          0
          • T turbochimp

            The previous post is not entirely correct. Close() and Dispose() do not do the same thing with respect to a SqlConnection. It is true that Dispose() will close the connection if the ConnectionState is Open, but the converse is not true: if Close() is called, the SqlConnection is not disposed, and your initial assertion is correct - the connection may be re-opened. In general, the following should ideally be true for disposable types (the concept of Close is not covered, since it doesn't really apply to the discussion, and may mean different things to different types - file streams, database connections, sockets etc.): 1. Dispose() should be responsible for cleaning up unmanaged resources and indicating to the GC that finalization is suppressed for the instance (suppressing finalization explicitly avoids the default two-pass collection of collectible objects). The value of Dispose() is that unmanaged resources can be reclaimed immediately (or nearly so), without waiting for the GC. Suppressing finalization for the object serves to streamline the garbage collection process so that it takes only one pass to reclaim the managed resources used by the object instead of two passes (one to finalize, one to reclaim). 2. Setting an object to null just drops a reference to the object, essentially setting it adrift in the (managed) heap until the GC executes and begins cleaning it up. There is no guarantee about when the resources for that object will be reclaimed. For more info, look here.[^] Hope this helps.

            The most exciting phrase to hear in science, the one that heralds the most discoveries, is not 'Eureka!' ('I found it!') but 'That's funny...’

            S Offline
            S Offline
            S Senthil Kumar
            wrote on last edited by
            #5

            turbochimp wrote: It is true that Dispose() will close the connection if the ConnectionState is Open, but the converse is not true: if Close() is called, the SqlConnection is not disposed I don't understand. If Dispose calls Close(), then Dispose and Close must do the same thing. What do you mean by "the SqlConnection is not disposed" ? If you can call Open() on a connection on which you've called Close, you can as well call it after calling Dispose(). Dispose doesn't do anything extra, as you can see with a tool like Reflector. Regards Senthil _____________________________ My Blog | My Articles | WinMacro

            M 1 Reply Last reply
            0
            • S S Senthil Kumar

              turbochimp wrote: It is true that Dispose() will close the connection if the ConnectionState is Open, but the converse is not true: if Close() is called, the SqlConnection is not disposed I don't understand. If Dispose calls Close(), then Dispose and Close must do the same thing. What do you mean by "the SqlConnection is not disposed" ? If you can call Open() on a connection on which you've called Close, you can as well call it after calling Dispose(). Dispose doesn't do anything extra, as you can see with a tool like Reflector. Regards Senthil _____________________________ My Blog | My Articles | WinMacro

              M Offline
              M Offline
              mav northwind
              wrote on last edited by
              #6

              Dispose calls Close, but Close doesn't call Dispose, so the two don't do the same thing! You can do this: SqlConnection conn = new SqlConnection(...); conn.Open(); conn.Close(); conn.Open(); conn.Dispose(); but you will get an exception with this: SqlConnection conn = new SqlConnection(...); conn.Open(); conn.Dispose(); conn.Open(); Regards, mav

              S 1 Reply Last reply
              0
              • E Enishi

                Ok heres a question its roaming my mind. Whats the difference doing for example. SqlConnection con= new SqlConnection(connection_string); con.close(); con.dispoe(); and con= null; AFAIK i think this. Close just clsoes the connection and can be opened again, dipose frees the resources so it cant be opened again, must declare again and null makes the GC get it faster. With this object i see it clearly but its the same for others? DataSet ds= new DataSet(); Lets take about datasets, if i do a ds.dispose() its completely erased? and what about if i do ds=null; whats will do if i return the dataset in a method and later i do a dispose or a null in the finally clausule. Ty for ur time.

                E Offline
                E Offline
                Enishi
                wrote on last edited by
                #7

                Okay now i see it more clear. Cause im working with 2 mates and 1 always does null, the other allways do Close or Dispose, and when i asked what was the difference they didnt know what to answer me. Ty for ur answers ppl.I appreciate ur help

                1 Reply Last reply
                0
                • M mav northwind

                  Dispose calls Close, but Close doesn't call Dispose, so the two don't do the same thing! You can do this: SqlConnection conn = new SqlConnection(...); conn.Open(); conn.Close(); conn.Open(); conn.Dispose(); but you will get an exception with this: SqlConnection conn = new SqlConnection(...); conn.Open(); conn.Dispose(); conn.Open(); Regards, mav

                  S Offline
                  S Offline
                  S Senthil Kumar
                  wrote on last edited by
                  #8

                  Well, if you have two methods A() and B(), and A does nothing but call B(), then they both do the same thing. If A called B and B called A, you'll get mutual recursion :) That apart, you're right, I missed the fact that Dispose clears the ConnectionString property after calling Close(). This piece of code works fine.

                    SqlConnection conn = new SqlConnection(...);     
                    conn.Open();
                    conn.Dispose();
                    conn.ConnectionString = "...";
                    conn.Open();
                    conn.Dispose();
                  

                  I still do maintain that they both essentially do the same thing, I don't know why the FCL designers added code to clear the connection string.. If you ask me, Close and Dispose should do the same thing. Regards Senthil _____________________________ My Blog | My Articles | WinMacro

                  T 1 Reply Last reply
                  0
                  • S S Senthil Kumar

                    Well, if you have two methods A() and B(), and A does nothing but call B(), then they both do the same thing. If A called B and B called A, you'll get mutual recursion :) That apart, you're right, I missed the fact that Dispose clears the ConnectionString property after calling Close(). This piece of code works fine.

                      SqlConnection conn = new SqlConnection(...);     
                      conn.Open();
                      conn.Dispose();
                      conn.ConnectionString = "...";
                      conn.Open();
                      conn.Dispose();
                    

                    I still do maintain that they both essentially do the same thing, I don't know why the FCL designers added code to clear the connection string.. If you ask me, Close and Dispose should do the same thing. Regards Senthil _____________________________ My Blog | My Articles | WinMacro

                    T Offline
                    T Offline
                    turbochimp
                    wrote on last edited by
                    #9

                    I think you are confused about the intended uses of Dispose() and Close(). They are very different. I would encourage you to read the same article I suggested in my original post. I would also encourage you to look further into what actually happens when Dispose() is called on a SqlConnection (or any type that implements IDisposable, if it's implemented correctly). Specifically, in SqlConnection.Dispose(), you will (or should) see a call to base.Dispose(disposing). If you had taken the time to inspect the base class (System.ComponentModel.Component), you would have seen that there's a little more to the disposal of the SqlConnection instance than you indicated in either of your posts.

                    The most exciting phrase to hear in science, the one that heralds the most discoveries, is not 'Eureka!' ('I found it!') but 'That's funny...’

                    S 1 Reply Last reply
                    0
                    • T turbochimp

                      I think you are confused about the intended uses of Dispose() and Close(). They are very different. I would encourage you to read the same article I suggested in my original post. I would also encourage you to look further into what actually happens when Dispose() is called on a SqlConnection (or any type that implements IDisposable, if it's implemented correctly). Specifically, in SqlConnection.Dispose(), you will (or should) see a call to base.Dispose(disposing). If you had taken the time to inspect the base class (System.ComponentModel.Component), you would have seen that there's a little more to the disposal of the SqlConnection instance than you indicated in either of your posts.

                      The most exciting phrase to hear in science, the one that heralds the most discoveries, is not 'Eureka!' ('I found it!') but 'That's funny...’

                      S Offline
                      S Offline
                      S Senthil Kumar
                      wrote on last edited by
                      #10

                      I admit that I was wrong with the semantics of Close() and Dispose with respect to SqlConnection. What I'm still not convinced about is that Close is supposed to be a "customized" Dispose, as this[^] and this[^] link mention, [EDIT] but in the case of SqlConnection, they act differently.[/EDIT] Regards Senthil _____________________________ My Blog | My Articles | WinMacro

                      T 1 Reply Last reply
                      0
                      • S S Senthil Kumar

                        I admit that I was wrong with the semantics of Close() and Dispose with respect to SqlConnection. What I'm still not convinced about is that Close is supposed to be a "customized" Dispose, as this[^] and this[^] link mention, [EDIT] but in the case of SqlConnection, they act differently.[/EDIT] Regards Senthil _____________________________ My Blog | My Articles | WinMacro

                        T Offline
                        T Offline
                        turbochimp
                        wrote on last edited by
                        #11

                        While I would have to place myself in the "Richter" camp on this as well, I understand the point these articles are trying to make, and I don't know if I really disagree with their implementations, except possibly from an aesthetic point of view. My thinking is: 1. Dispose() has a clear definition and purpose regardless of type. If the type has unmanaged resources, and it may be important to release those resources in a time-critical manner, then the type will likely benefit from a Dispose() method. 2. Close() has a somewhat less well-defined purpose that is affected by the type on which it is implemented. It has a high-level meaning that applies in most places (i.e. "To stop or obstruct some kind of operation or behavior") and means the same thing to most people, but the specifics of how to "Close" an instance of a type are potentially specific to the type itself, as are the rules about re-opening the instance, how closing affects state, etc. There are clearly some cases where Close() and Dispose() might effectively mean the same thing, as the first article suggests, but there are obviously others (e.g. SqlConnection) where the intent of the developers was to make the methods behave differently. Both are okay in my book, but what can't get overlooked is that while Close() may or may not be implemented on a disposable type, the IDisposable interface ( thus Dispose() ) *must* be implemented, or unexpected results may ensue. In those cases where Close() and Dispose() are interchangeable, the word "Close" may be considered more "user friendly" or less confusing than "Dispose", and so a case can be made for implementing a Close() method that simply masks the Dispose() method. In general though, I'd prefer a more expository API (one that had both methods marked public, if the developers really felt that strongly about it), but that's just me, and the decision really boils down to developer preference and the consuming client's perceived level of understanding. Have a good one.

                        The most exciting phrase to hear in science, the one that heralds the most discoveries, is not 'Eureka!' ('I found it!') but 'That's funny...’

                        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