|
Regarding the issues, there are a few more, like initializing a variable only to re-initialize a few lines later, and others.
In .NET especially, there is connection pooling for database connections, meaning that even after you close a connection, the connection is kept alive by the framework, and next time you open the connection, the existing connection will be reused. No comment on the Singleton pattern.
It is considered a best practice to always call the Dispose method on a Class that implements IDisposable. This is why there is a
using (resource) { } construct built into the language. Classes usually implement IDisposable to indicate that they are using external resources which need to be released once you are finished with the class.
In .NET, once a method has completed (returned), any instances created that have no other references can be collected by the Garbage Collector (GC). However, because the GC decides to clean the memory in its own time, this can sometimes mean that instances remain alive for longer than necessary. For example, on a computer with a lot of RAM, the GC may not run for a long time, as there is no issue with Memory.
Another issue with relying on the GC is that the GC will not call the Dispose method on an instance, as it doesn't know anything about IDisposable . What it does is call the Finalize method (known as the Finalizer), which all classes inherit from Object . However, the way in which GC calls the Finalizer means that the instance has to be kept alive for longer than absolutely necessary, at minimum until the next GC collection. Additionally, not all classes necessarily implement a Finalizer.
If a class used external resources, such as a file or a database connection and doesn't release the resource, the external resources may remain inaccessible even after the .NET application closes.
|
|
|
|
|
Thank you for your comments. I had no idea that GC uses some form of Lazy scheduling. Any pointers on documentation that would guide me towards the accepted standards for .Net programming?
|
|
|
|
|
Accepted standards for programming should theoretically be the same for most languages, such as using recognized Design Patterns. This can depend on the type of environment you are working in, which can be desktop, web, mobile, cloud, etc. There are plenty of blogs and sites out there that discuss these issues.
For more information on .NET Garbage Collection and IDisposable/Finalizers, you can check out the following links:
Garbage Collection[^] - Covers Garbage Collection in .NET, with details about the how it works.
Cleaning Up Unmanaged Resources[^] - Discusses Disposing and Finalizing in .NET.
|
|
|
|
|
Thank you . Unfortunately the web seems to be a rather disparate source of information with more biases than useful information so I did not have much luck .I just finished the Heads First Patterns book and now I got the GoF book and intend to read it soon. Thanks for the info re Garbage collection
|
|
|
|
|
From my experience, the best way to learn is to read as much as you can, but at the same time to write as much code as possible. There are a number of sites out there with programming puzzles, which you may find interesting and instructive.
A good mentor is also an excellent way to learn those subjects, as they should be able to help guide you from experience, which is the best way to learn any subject. Code reviews are also a great way to gain experience.
Thing is, I think most of programming theory is going to be opinionated. Look at what's happening with the MVC pattern today: There is MVC, MVP, MVVM, there are even frameworks out there that just call themselves MV-Something or MV*. All of them are slightly different, even those that call themselves MVC.
Patterns are a shared language for design, not a particular implementation, so sometimes they are interpreted differently, or can/should be implemented differently in a particular technology.
Remember to keep an open mind: there is always more than one way of accomplishing your goal.
|
|
|
|
|
I think you hit the nail on the head, reading is key but application is more important. I seem to have a hard time adapting what I am reading unless it is blindingly obvious. What are the sites with programming puzzles that you are referring to. I have been writing code for almost 17 years now in various languages and platforms but I discovered Patterns just months ago (though I suspected their existence for years)and I am slowly realizing that the vast majority of my applications were a horrible implementation of MVC and Active Record patterns. I think I am a voracious reader but in the past I did not want to read anything related to programming or design but I am trying to change that. A good mentor seems to be extremely hard to find .
Again thanks for your time
|
|
|
|
|
Generally an excellent post, however this:
Schmuli wrote: If a class used external resources, such as a file or a database connection and doesn't release the resource, the external resources may remain inaccessible even after the .NET application closes.
... isn't true on a decent operating system (and Windows qualifies these days), because when the process ends all its resource ties will be killed by the OS.
But yes, relying on the GC to clean up after you is a bad plan, because there's no guarantee that the GC will run immediately, or even ever.
|
|
|
|
|
BobJanova wrote: ... isn't true on a decent operating system (and Windows qualifies these days),
because when the process ends all its resource ties will be killed by the
OS.
Actually, he was right in certain cases. The example I'm thinking of is an Oracle connection. If the connection isn't disposed, even if the underlying application dies, the connection may be left open. This was a real pain point for us on a project that we had to interface with. It took me and the client DBA ganging up on the project lead before he ensured the connections were closed.
All of a sudden, 300-400 active connections were reduced to less than a handful.
|
|
|
|
|
Are you sure the process was being killed? This sounds like it might have been a web app and IIS would have been the process in that case, so you'd be relying on the GC to come along and help you.
File handles, open sockets and properly registered graphical resources are definitely released when a process ends under Windows.
Obviously, it's still good practice to close your resources manually because you don't want to make the user close your application to free them!
|
|
|
|
|
BobJanova wrote: Obviously, it's still good practice to close your resources manually because you
don't want to make the user close your application to free them!
It is, it was and always will be. Unless you are a member of the reformed Java religion, who do not believe in managing memory and resources.
At least artificial intelligence already is superior to natural stupidity
|
|
|
|
|
Relying on the GC to clean up after classes that implements IDisposable may be dangerous - in some cases such a class may never be garbage collected and thus in practice lead to memory leaks.
Consider a class that e.g., when instantiated, subscribes to an event from .NET's SystemEvents class (a GUI application might e.g. subscribe to UserPreferenceChanged). Because these events are static, the delegate have a reference to the class that lasts for the entire lifetime of the application, i.e. it will prevent the class from being GC'ed until it unsubscribes from the event. I.e. the user of the class will have to tell it when it no longer needs to subscribe to such an event - the obvious way to do that is by calling Dispose.
Now, you could argue that not all classes that implements Dispose suffer from this, but how would you know (and know that a future version of the class wouldn't require it either)? And should you know - is it not the purpose of encapsulation to ensure that you don't have to know about implementation details like this?
Due to this, in my opinion is should not only be best practice, but required that you call Dispose on a class that implements IDisposable.
|
|
|
|
|
Re: 1) - you're not going to invite SQL injection with a method. You'll invite injection from user entry or some such thing. I guess I'm suggesting this method is safe IF I can assume some protection is in place before it is invoked.
|
|
|
|
|
At least he made it a Private function, that is one good thing!
|
|
|
|
|
Maybe the Republicans are correct when they say "Outsourcing is good for the economy." It keeps all of us employed rewriting all that crap code!
|
|
|
|
|
Return oRs
oRs.Dispose()
oDAdapt.Dispose()
the dispose never gets hit because the return will exit the function
|
|
|
|
|
Someone may have already pointed this out, I've not read all the replies yet, but the first thing I noticed is that the lines that dispose the dataset and dataadapter will never execute.
|
|
|
|
|
Indeed. That is one of the many things wrong with this code.
|
|
|
|
|
There is a few wrong stuff, but main error is that code is written on an bastardly stupid VB!
|
|
|
|
|
A screenshot from my laptop early today..
<a href="https://picasaweb.google.com/lh/photo/De0HCAngTHWVhc6HEy3NJNMTjNZETYmyPJy0liipFm0?feat=directlink">https://picasaweb.google.com/lh/photo/De0HCAngTHWVhc6HEy3NJNMTjNZETYmyPJy0liipFm0?feat=directlink</a>[<a href="https://picasaweb.google.com/lh/photo/De0HCAngTHWVhc6HEy3NJNMTjNZETYmyPJy0liipFm0?feat=directlink" target="_blank" title="New Window">^</a>]
-- modified 27-Jul-12 5:14am.
|
|
|
|
|
|
Edited it in latest Chrome. Doesn't show up too good with that either.
|
|
|
|
|
Just copy the link direct from the address bar, and paste it into the page.
One of four things will happen:
1) It will automatically become linkified (mine did, and about 90% or more do)
2) It will be pasted, and an option will appear at thr right hand side - select "as is" and then highlight the link before pressing the [^] widget.
3) It will be pasted and no option will appear but there is a good chance it will be surrounded by pare tags, selected to VB. Swear. remove the pre tags, and treat as above.
4) It will be pasted, not option will appear and your browser will freeze up. Swear lots. Wait. Wait some more. Swear some more. Wait. Eventually it comes back to life and you can continue with 2 or 3 above.
Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water
|
|
|
|
|
What Windows did to me (as shown in the link) was much better. I would rather take down the link.
|
|
|
|
|
Sorry Griff, replied on the wrong part of the thread..
Bastard Programmer from Hell
if you can't read my code, try converting it here[^]
|
|
|
|
|
I've done it myself from time to time...
Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water
|
|
|
|