|
This is why I said you should explain the effect of the using statement further, I knew it would cause you confusion.
|
|
|
|
|
I'm sorry but that is wrong.
A use statement is just syntactic sugar for a try finally block. What you are proposing translates to:
Bar bar = null;
try
{
bar = new Bar();
...
return new FooX(bar);
}
finally
{
if (bar != null)
{
bar.Dispose();
}
}
When the method gets to the return statement, it will execute the finally clause before exiting the method's scope returning a FooX object with a disposed bar.
If you are not convinced execute the following code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Tests
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Creating FooA 'fooA' from GetFooAWithUsingStatement.");
FooA fooA=FooProvider.GetFooAWithUsingStatement();
Console.WriteLine("'fooA' internal bar is disposed: {0}", fooA.InternalBarIsDisposed);
Console.WriteLine("Disposing 'fooA'");
fooA.Dispose();
Console.WriteLine("'fooA' internal bar is disposed: {0}", fooA.InternalBarIsDisposed);
Console.WriteLine();
Console.WriteLine("Creating FooA 'fooA' from GetFooAWithoutUsingStatement.");
fooA = FooProvider.GetFooWithoutUsingStatement();
Console.WriteLine("'fooA' internal bar is disposed: {0}", fooA.InternalBarIsDisposed);
Console.WriteLine("Disposing 'fooA'");
fooA.Dispose();
Console.WriteLine("'fooA' internal bar is disposed: {0}", fooA.InternalBarIsDisposed);
Console.Write("Press a key to exit.");
Console.ReadKey();
}
}
class Bar : IDisposable
{
bool disposed;
public void Dispose()
{
this.disposed = true;
}
public bool IsDisposed { get { return this.disposed; } }
}
static class FooProvider
{
public static FooA GetFooAWithUsingStatement()
{
using (Bar bar = new Bar())
{
return new FooA(bar);
}
}
public static FooA GetFooWithoutUsingStatement()
{
Bar bar = new Bar();
return new FooA(bar);
}
}
class FooBase : IDisposable
{
bool disposed;
Bar bar;
internal FooBase(Bar bar)
{
this.bar = bar;
}
public void Dispose()
{
Dispose(true);
this.disposed = true;
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
this.bar.Dispose();
}
}
public bool IsDisposed { get { return this.disposed; } }
public bool InternalBarIsDisposed { get { return this.bar.IsDisposed; } }
}
class FooA : FooBase
{
public FooA(Bar bar)
: base(bar)
{
}
}
}
To make things clear I should clarify that 'FooX' needs 'bar' to not be disposed during its lifetime. I thought I had made myself clear indirectly by needing to dispose 'bar' in 'FooBase.Dispose()' method.
My question remains the same: Is the Warning I'm getting valid or is the Analyzer not understanding the way the code really works and I can supress it even if MS guidelines says you should not do so?
Edit: typos (not all by any means)
modified on Tuesday, May 24, 2011 9:37 AM
|
|
|
|
|
Then it is better to suppress the warning.
|
|
|
|
|
IMO, the warning is invalid in this situation. If the method was simply returning Bar then you would not get the warning, so it's not understanding that returned Foo requires Bar so should not be disposed.
|
|
|
|
|
Hi to all I am making bar chart in crystal report13.I want to show comparison between two years data like room occupancy of Jan-2010 and room occupancy of Jan-211 are place near to each other and when next month start that is place at some distance.
Its can be possible?
Thanks & Regards,
Ayushi Rastogi
|
|
|
|
|
Hi,
I have a following file names in my database.
TestDocument _ 1 _ 0
TestDocument _ Evidence
Test45
123_publish
when i am entering the Test_ in the DocumentName textbox it is forst converted to uppercase and send to the query and query has following expression which returns all record where it should not have to return any record.
please tell me the changes in the following expression.
UPPER(DOC.ORIGINAL_FILE_NAME) like '%TEST_%'
Thanks,
Umesh Tayade .
modified on Tuesday, May 24, 2011 6:32 AM
|
|
|
|
|
This looks like a database question, not a C# issue.
And wildcard operations aren't the same for all databases, so you'll have to specify what it is you are using.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
Hi,
I am using Oracle10g database.
Thanks,
Umesh Tayade
|
|
|
|
|
|
Windcards? Where did the OP mention chronic flatulence?
|
|
|
|
|
Sorry. I meant windcharts of course. Fixed it. Thanks.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
Seriously, you can't see the issue. Take a look at your file names and point out the name that starts with 'TEST_' . I see TestDocument and Test45 no Test_
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Hi,
I know that there is no document with the name TEST in my database but what i am telling is that when i search for TEST_ it should not have to return any records. but it is returning the records.
Thanks,
Umesh Tayade
Never Underestimate the power of Human Stupidity
|
|
|
|
|
It is returning records because you have two sets of wildcards in the query. In other words, you have the % and the _ characters. Effectively, your query is %TEST%.
|
|
|
|
|
If you want to use the _ as a valid identifier in your query rather than having it act as a wildcard, you should precede it with a \ , so your query would become %TEST\_% .
|
|
|
|
|
Are you aware that, in Sql Server at least, the underscore character (_) is the wildcard for a single character? Very nasty in my opinion. You may wish to specify a different character in your query.
|
|
|
|
|
Hi
I have 50 splitcontainers.. i want to read all the splitcontainers & its panels programmatically...Is it possible...?
Because the below code only reads Splitcontainer4 & Panel1, But Iam looking to read all the splitcontainers and its panels programmatically...
foreach (Control Ctrl in this.splitContainer4.Panel1.Controls)
{
if (Ctrl is RichTextBox)
{
((RichTextBox)(Ctrl)).KeyPress += new KeyPressEventHandler(this.Common_KeyPress);
}
}
Thanks for ideas...
Regards
PARAMU
|
|
|
|
|
Just expand your code to add a foreach statement to check each SplitContainer in this , and each Panel in the SplitContainer s.
The best things in life are not things.
|
|
|
|
|
Can you show some samples..I tried...I didn't get...?
foreach (Control AllCtrl in this.Controls)
{
if (AllCtrl is SplitContainer)
{
foreach (Panel MyPanes in AllCtrl.Controls)
{
MessageBox.Show(MyPanes.Name, "some text", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}
}
Thanks
|
|
|
|
|
Paramu1973 wrote: I didn't get
Didn't get what?
Try running this in your debugger to see exactly what containers you are picking up at each point. Apart from anything else it will help you to understand exactly what each step of your program is doing.
The best things in life are not things.
|
|
|
|
|
Hi Thanks.
But the problem is splitcontainer1.panel2 is having splitcontainer2
And splitcontainer2.panel1 is having splitcontainer3
and splitcontainer3.panel2 is having splitcontainer4
and splitcontainer4.panel2 is having richtextbox1
like wise no any order..they docked...and some panels are having label & some panels are having richtextbox...
I need to catch that control...
Thanks
|
|
|
|
|
Naming a variable "AllControls" won't get you "all controls". Instead, when you find a SplitPanel , call your method again, using the SplitPanel as the new source;
void Bla(Control SourceCtl)
{
foreach (Control Ctrl in SourceCtl)
{
if (Ctrl is RichTextBox)
{
((RichTextBox)(Ctrl)).KeyPress += new KeyPressEventHandler(this.Common_KeyPress);
}
else if (Ctrl is SplitPanel)
{
Bla(Ctrl);
}
}
}
The technique is called recursion. (Didn't test the method, but should be close enough to get you started)
Bastard Programmer from Hell
|
|
|
|
|
You're getting closer. Try this:
void DoAllRichTextBoxes(Control control) {
RichTextBox rtb=control as RichTextBox;
if (rtb==null) {
foreach(Control c in control.Controls) DoAllRichTextBoxes(c);
} else {
rtb.KeyPress+=new KeyPressEventHandler(this.Common_KeyPress);
}
}
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
I got it. Thanks a lot.
Again Thanks Regards
PARAMU
|
|
|
|
|
you're welcome
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|