|
Pete O'Hanlon wrote: This is the whole problem with FxCop (and utility's like it). They give broad brush guidelines that people tend to end up as treating as gospel.
While that is generally true, FxCop does provide some very solid guidelines. The end result is that it should be up to the developer/development team/... to decidd which guidelines are appropriate. I know that isn't always the case, but that's the idea behind these types of tools. They also help people learn the right way to do the majority of things in .NET.
Pete O'Hanlon wrote: This suggestion only makes sense if your SqlConnection/SqlCommand objects are member variables.
Based on the sample code in the original message, this is the case so the guideline is accurate.
Pete O'Hanlon wrote: If they are a local variable then there is no sense in using IDisposable to manage this.
Very true and if that were the case, FxCop never would have flagged this issue.
Scott Dorman Microsoft® MVP - Visual C# | MCPD
President - Tampa Bay IASA
[ Blog][ Articles][ Forum Guidelines] Hey, hey, hey. Don't be mean. We don't have to be mean because, remember, no matter where you go, there you are. - Buckaroo Banzai
|
|
|
|
|
Correct. It told you that because you are declaring your SqlConnection and SqlCommand variables as class-wide variables. In that case, you do need to implement IDisposable .
Scott Dorman Microsoft® MVP - Visual C# | MCPD
President - Tampa Bay IASA
[ Blog][ Articles][ Forum Guidelines] Hey, hey, hey. Don't be mean. We don't have to be mean because, remember, no matter where you go, there you are. - Buckaroo Banzai
|
|
|
|
|
Blumen wrote: Does that mean I have to override dispose on my class like:
If your class is inherited from another class which implements IDisposable and uses dispose pattern, then you have to override the virtual method provided. If your class is the one which implements IDisposable and you want to make it as sealed, don't use the dispose pattern at all. Just write cleanup in the dispose method provided by the IDisposable interface.
You use dispose pattern if you need to allow subclasses also to do cleanup. Example is "Stream ".
Scott dorman has a great article[^] on the subject. It's worth reading.
|
|
|
|
|
Yes, my class implements IDisposable interface. I'll refer the article you have provided, thank you.
|
|
|
|
|
N a v a n e e t h wrote: Scott dorman has a great article[^] on the subject. It's worth reading.
Thanks!
Scott Dorman Microsoft® MVP - Visual C# | MCPD
President - Tampa Bay IASA
[ Blog][ Articles][ Forum Guidelines] Hey, hey, hey. Don't be mean. We don't have to be mean because, remember, no matter where you go, there you are. - Buckaroo Banzai
|
|
|
|
|
The code you show doesn't match your error message. Your code does not show the CustomerDal as a sealed class.
For more information on the Dispose pattern, check out this article[^].
If you are going to seal the class, then you can't declare protected methods (or properties). Sealing tells the compiler that nothing can inherit from that class; since protected means that only that class and any derived class can access it, protected methods are effectively useless. As Colin pointed out, making the method private would work.
If you really want to seal your class, then you only need to implement the IDisposable interface, not the full Dispose pattern. In your sample code, the logic you have in the Dispose(bool) method would simply go in the Dispose() method, which would be the only method you need to implement.
Scott Dorman Microsoft® MVP - Visual C# | MCPD
President - Tampa Bay IASA
[ Blog][ Articles][ Forum Guidelines] Hey, hey, hey. Don't be mean. We don't have to be mean because, remember, no matter where you go, there you are. - Buckaroo Banzai
|
|
|
|
|
The reason why I thought of sealing my Data Access class in the first place is because it is not meant to be a base class. It just contains a few Methods calls that fetch data from database or write/edit data (queries basically).
Thanks to all who have replied to my query here. I hope this code is correct:
public sealed class CustomerDal:IDisposable
{
SqlConnection connection;
SqlCommand command;
public void Dispose()
{
if (connection != null)
connection.Dispose();
if (command != null)
command.Dispose();
}
}
Could anyone point me to a resource where I can find a DAL class which is provider independent, which supports transaction as well in C# 2.0?
Regards,
Blumen
|
|
|
|
|
Blumen wrote: Could anyone point me to a resource where I can find a DAL class which is provider independent, which supports transaction as well in C# 2.0?
NHibernate or Castle ActiveRecord both fit the bill here (although strictly speaking they are more ORM and ActiveRecord builds on top of NHibernate).
|
|
|
|
|
|
How can I know whether a string contains a url? It's very easy if it starts with http:// but I'm talking about urls that don't start with http://, I don't want to extract the url, I just want to know whether a string contains a url or not, any ideas?
|
|
|
|
|
Use regular expressions
Please remember to rate helpful or unhelpful answers, it lets us and people reading the forums know if our answers are any good.
|
|
|
|
|
Thanks for your reply, actually the problem I find with using a regular expression is that it can become really hard to distinguish normal text from a url, as I mentioned in my post, I want to find urls even if they don't start with http://, this what makes it really challenging.
|
|
|
|
|
The answer you were given was good, the only other thing you could do, to see if it's a VALID URL, is to do a HTTP Post to it and see what you get back.
Christian Graus
No longer a Microsoft MVP, but still happy to answer your questions.
|
|
|
|
|
Thanks for your answer but I'm afraid this is not possible, I'm just trying to write a spam filter for my website, so I can't keep users waiting that long, I thought about searching for all TLDs but I don't think it's a good idea, performance-wise. Do you know of any good spam filter that I can call from ASP.NET application? ie. send it a string and gets something like a boolean indicating whether it's spam or not, a percentage will even be much better than a boolean (the percentage of how likely this post is spam), thanks.
|
|
|
|
|
I think I just answered this in the ASP.NET forum.
There is no way of knowing if a string is a *valid* URL without posting to it. Telling if a string is a valid URL is easy with regex tho.
Christian Graus
No longer a Microsoft MVP, but still happy to answer your questions.
|
|
|
|
|
Ok, now I get your point, actually I don't care whether they are valid or not, as I mentioned before it's just for spam filtering so it's not important to check whether they are valid ..
Let me explain from the beginning (hopefully you have the time to read all this )
In my website, users should be adding a lot of posts in a short time and I want the site to be as fast and responsive as possible when they do this, so, basically I'm looking for a spam filter that will run on my machine (as opposed to spam filters that call a web service on another website, like akismet, which can be good for blogs and sites that don't receive many posts). Unfortunately I wasn't able, so far, to find such thing, this is why I'm trying to write it myself and it seems more complicated than what I thought.
Well, I thought of two approaches that I can use to detect spam:
- Using naive bayesian (there's an article here on code project that talks about that, see http://www.codeproject.com/KB/recipes/BayesianCS.aspx[^])
- Using some rules that usually apply to spam and this is what I'm trying to do. Actually naive bayesian is very effective in most cases but it's basically because of something related to my app. Read on:
Due to the nature of my website, users wouldn't normally post any text that contains links (and I don't change links that start with http:// to anchor tags). So, it's reasonable to assume that posts that contain links will most likely be spam. Spammers can spam your site for two reasons, first to get a higher page rank for some website, more accurately for some web page (which is not true in my case as I don't change links into anchor tags, and even if I was I could use rel="nofollow" as most people do) but anyway the point is that the spam contains a url, second to advertise something and in this case they have to leave a url, email or a phone number (if you can't reach the advertiser then the ad is useless, right?). Probably you're thinking that if I don't change the links into anchor tags they won't spam my site, I can assure you they are dumb enough to do this, I have seen many other websites that don't change links into anchors still they are heavily spammed (but may be not because they are dumb, it might be because it's rumored that google detects any links that start with http:// when crawling your site even if they are not in anchor tags, I have no idea though whether this is true or not). Anyway, what I'm trying to do is find whether the post contains any of these (url, email or phone number). Finding the email address or phone number is fairly easy with regex, finding the url is fairly easy if it starts with http://, but now there are two problems with this approach, first, by having a look on some spam ads I noticed that some spammers don't start their urls with http://, and second if they know that I only check for http:// they will post all urls without it. Now the real complication is to find urls that don't start with http://, because basically anything that has a 'dot' inside can be a url, so if a user doesn't leave a space between the period that ends a sentence (full stop) and the next sentence, it will be detected as a url (this is along with so much other text that can contain a dot between two strings yet it's not a url), so I thought I can use the TLDs (generic and country codes) but in this case our regex will be way too long! This will most probably affect performance, and even if you decide not to use regex (probably using a loop that checks for every TLD) this will also most probably affect performance, and to make things even worse, some completely valid text, like asp.net for example, will be detected as a url (and it's even a valid url in case you do a post ).
This is getting more complicated than needed, I think I'll either drop urls that only has two parts (like asp.net) or use naive bayesian
And BTW, the reason I wanted the spam filter to return a percentage is because some posts are guaranteed to be spam (the spam filter keeps a database of spam ads, when it receives a post it hashes it and compares it to the spam ads that has the same hash, SpamAssassin does this I believe), in this case the spam filter should return 100% but if the post is not guaranteed to be spam it returns a percentage less than 100% (depending on how much this post is likely to be spam). In my app, I will not save the posts that are 100% spam to the database but those that have a percentage less than 100% will be saved but won't be visible to any users except the ones who posted them until manually checked by a moderator.
Sorry for making this too long, just wanted to explain why I'm doing this ...
Have a great day ...
modified on Sunday, August 17, 2008 10:45 AM
|
|
|
|
|
Waleed Eissa wrote: Using naive bayesian
But again, Naive Bayes algorithm doesn't have inteliigence on its own.
It has to be trained in proper manner to produce results. The more you train him, the better results it will yield.
Please remember to rate helpful or unhelpful answers, it lets us and people reading the forums know if our answers are any good.
|
|
|
|
|
Actually I'm not esp. interested in Naive Bayes algorithm or any other algorithm, I'm just trying to filter out the spam, can you suggest a better way for doing this? And if you know of a good spam filter that I can use in my application that will even be much better.
Regards
|
|
|
|
|
Use regular expressions as you have already been told. Instead of checking for something like http://, why not just check for things like .com, .net, .edu, etc.
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
|
|
|
|
|
Hi Paul, thanks for your answer, the problem with checking for domain names, like .com, .net .. etc, is that there are too many TLDs to check for (because you have to check for ccTLDs which are very commonly used by spammers), this is along with some other problems too, please refer to my last post.
Regards
|
|
|
|
|
Hello,
My application let user download some files from my web site,I want to let him download one file, only my program can recognize the file and work with it.Is it possible.
Thanks.
Dad
|
|
|
|
|
What would be the problem, registering the file extension on client?
|
|
|
|
|
the problem is how to structure a file that only my application can read.This file holds an image and a structure of an html document.
Dad
|
|
|
|
|
Sounds like an serialized xml document, optionally in binary format.
File itself is readable by any application or user but to understand its content is application specific.
|
|
|
|
|
|