stack issue
-
I ignored your last code post because it's not the same as your original post.
if (true) ... if (true) ...
is NOT the same as:
if (something) ... if (something**\_else**) ...
Your last code post is identical in output to:
string text;
if (true)
{
text = "closed";
FormClosed += delegate( object sender, FormClosedEventArgs e )
{ MessageBox.Show( text ); };text = "closing"; FormClosing += delegate( object sender, FormClosingEventArgs e ) { MessageBox.Show( text ); };
}
The problem was never in the compiler, but in your logic.
A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007You don't even need to put the if there... Now... all this not to answer my question?? Come one... you can do better than that, can't you? If I said that it wasn't relevant, it's because it wasn't... Now... you can remove the if... are you gonna answer my question or are you just gonna pretend you're so very awesome? Cheers
Gonçalo A.
-
You don't even need to put the if there... Now... all this not to answer my question?? Come one... you can do better than that, can't you? If I said that it wasn't relevant, it's because it wasn't... Now... you can remove the if... are you gonna answer my question or are you just gonna pretend you're so very awesome? Cheers
Gonçalo A.
Kensho wrote:
Come one... you can do better than that, can't you? If I said that it wasn't relevant, it's because it wasn't
That's what YOU think. It WAS relevant. The key piece of information was, and still is, missing. I already explained to why that's the case, but you keep insisting that it's not. It's not me that has the problem, it's you. The first rule of asking a question is to listen.
Kensho wrote:
Now... you can remove the if... are you gonna answer my question or are you just gonna pretend you're so very awesome?
I already answered this in my previous post. Sure, you can remove the if. Your code would still be this:
string text;
text = "closed";
FormClosed += delegate( object sender, FormClosedEventArgs e )
{ MessageBox.Show( text ); };text = "closing";
FormClosing += delegate( object sender, FormClosingEventArgs e )
{ MessageBox.Show( text ); };Perhaps you're misunderstanding what the two
delegate
statements are doing??A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007 -
You don't even need to put the if there... Now... all this not to answer my question?? Come one... you can do better than that, can't you? If I said that it wasn't relevant, it's because it wasn't... Now... you can remove the if... are you gonna answer my question or are you just gonna pretend you're so very awesome? Cheers
Gonçalo A.
Kensho wrote:
Come one... you can do better than that, can't you? If I said that it wasn't relevant, it's because it wasn't
That's what YOU think. It WAS relevant. The key piece of information was, and still is, missing. I already explained to why that's the case, but you keep insisting that it's not. It's not me that has the problem, it's you. The first rule of asking a question is to listen.
Kensho wrote:
Now... you can remove the if... are you gonna answer my question or are you just gonna pretend you're so very awesome?
I already answered this in my previous post. Sure, you can remove the if. Your code would still be this:
string text;
text = "closed";
FormClosed += delegate( object sender, FormClosedEventArgs e )
{ MessageBox.Show( text ); };text = "closing";
FormClosing += delegate( object sender, FormClosingEventArgs e )
{ MessageBox.Show( text ); };Perhaps you're misunderstanding what the two
delegate
statements are doing??A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007 -
Kensho wrote:
Come one... you can do better than that, can't you? If I said that it wasn't relevant, it's because it wasn't
That's what YOU think. It WAS relevant. The key piece of information was, and still is, missing. I already explained to why that's the case, but you keep insisting that it's not. It's not me that has the problem, it's you. The first rule of asking a question is to listen.
Kensho wrote:
Now... you can remove the if... are you gonna answer my question or are you just gonna pretend you're so very awesome?
I already answered this in my previous post. Sure, you can remove the if. Your code would still be this:
string text;
text = "closed";
FormClosed += delegate( object sender, FormClosedEventArgs e )
{ MessageBox.Show( text ); };text = "closing";
FormClosing += delegate( object sender, FormClosingEventArgs e )
{ MessageBox.Show( text ); };Perhaps you're misunderstanding what the two
delegate
statements are doing??A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007If the code does the same, it WAS IRRELEVANT; if it was relevant, the code would do something different. I'll just state the output of that code... When you close the form, two message boxes will appear... One will say "closing", and the other one will say "closing". I said this right from the start.
Gonçalo A.
-
Consider the following code...
string text; foreach ( something ) { if ( something ) { text = "closing"; someForm.FormClosing += delegate( object sender, FormClosingEventArgs e ) { MessageBox.Show( text ); }; } if ( something_else ) { text = "closed"; someForm.FormClosed += delegate( object sender, FormClosedEventArgs e ) { MessageBox.Show( text ); }; } }
The foreach will have a something, and then a something_else, in this order. So, what will happen here, is that both events will trigger a MessageBox displaying "closed" text. To fix this, I passed the string text inside the foreach, and the issue isn't an issue anymore. Now... can anyone explain me why does this happen? The delegate uses the reference instead of the value?Gonçalo A.
One word : closures. A closure captures the value of a variable in its lexical scope. Your event handlers are anonymous functions which capture the local variable
text
. Behind the scenes, the compiler generates a new class with the captured variable as a member and rewires the event handler so that it calls a method on the generated class. That class then uses the member variable's value to fill in for the captured variable. The compiler updates the generated class instances with the value of captured variables as long as the captured variables are in scope. In your case,text
was declared outside the scope of both if blocks, so the compiler dutifully updated the value of the variable when you changed it inside the second if block. Just to make things clear, this is not done only for reference types (like string).delegate void Func(); static void Main() { Func\[\] f = new Func\[10\]; for (int i = 0; i < 10; ++i) { f\[i\] = delegate { Console.WriteLine(i); }; } foreach (Func func in f) { func(); } }
This will print 10 all ten times.
Regards Senthil [MVP - Visual C#] _____________________________ My Blog | My Articles | My Flickr | WinMacro
-
One word : closures. A closure captures the value of a variable in its lexical scope. Your event handlers are anonymous functions which capture the local variable
text
. Behind the scenes, the compiler generates a new class with the captured variable as a member and rewires the event handler so that it calls a method on the generated class. That class then uses the member variable's value to fill in for the captured variable. The compiler updates the generated class instances with the value of captured variables as long as the captured variables are in scope. In your case,text
was declared outside the scope of both if blocks, so the compiler dutifully updated the value of the variable when you changed it inside the second if block. Just to make things clear, this is not done only for reference types (like string).delegate void Func(); static void Main() { Func\[\] f = new Func\[10\]; for (int i = 0; i < 10; ++i) { f\[i\] = delegate { Console.WriteLine(i); }; } foreach (Func func in f) { func(); } }
This will print 10 all ten times.
Regards Senthil [MVP - Visual C#] _____________________________ My Blog | My Articles | My Flickr | WinMacro
Exactly! Now that's an answer. Thank you. Cheers
Gonçalo A.
-
If the code does the same, it WAS IRRELEVANT; if it was relevant, the code would do something different. I'll just state the output of that code... When you close the form, two message boxes will appear... One will say "closing", and the other one will say "closing". I said this right from the start.
Gonçalo A.
if (true){
text = "closed";
FormClosed += delegate( object sender, FormClosedEventArgs e )
{ MessageBox.Show( text ); };
text = "closing";
FormClosing += delegate( object sender, FormClosingEventArgs e )
{ MessageBox.Show( text ); };
}So you mean to tell me that you thought
text
in each delegate would get a copy of the current contents of thetext
variable when the delegates were created?? You'll have to excuse me as I (wrongly) assumed you knew how variables worked. This was such a basic concept you were missing that I didn't even consider it a possibility that that's where you were misunderstanding the code. To me, it was obvious this would be the behavior. I originally thought that you were wondering why both sections of code were being run because bothif
statements were being evaluated totrue
.A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007 -
if (true){
text = "closed";
FormClosed += delegate( object sender, FormClosedEventArgs e )
{ MessageBox.Show( text ); };
text = "closing";
FormClosing += delegate( object sender, FormClosingEventArgs e )
{ MessageBox.Show( text ); };
}So you mean to tell me that you thought
text
in each delegate would get a copy of the current contents of thetext
variable when the delegates were created?? You'll have to excuse me as I (wrongly) assumed you knew how variables worked. This was such a basic concept you were missing that I didn't even consider it a possibility that that's where you were misunderstanding the code. To me, it was obvious this would be the behavior. I originally thought that you were wondering why both sections of code were being run because bothif
statements were being evaluated totrue
.A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007bwahahahahaha I really had to laugh on this one... And you're a Microsoft MVP??? Well... you're from VB, so... I guess I have to understand. First... it's not a variable matter. It's a closures matter. And I said from the start what would happen; you were the one saying otherwise... so... don't try to cover up your stupidity now... And... weren't you supposed to be here to help? Get over your frustration, it's unhealthy for this forum users. Cheers
Gonçalo A.
-
bwahahahahaha I really had to laugh on this one... And you're a Microsoft MVP??? Well... you're from VB, so... I guess I have to understand. First... it's not a variable matter. It's a closures matter. And I said from the start what would happen; you were the one saying otherwise... so... don't try to cover up your stupidity now... And... weren't you supposed to be here to help? Get over your frustration, it's unhealthy for this forum users. Cheers
Gonçalo A.
One word: Blacklisted.
A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007 -
One word: Blacklisted.
A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007In lack of a wiser answer... I don't mind... Cheers
Gonçalo A.