|
z = 1012
???
<a href="http://www.widmarkrob.com">My Coding Journey</a>
|
|
|
|
|
Ok, let's look at it (though it's a PITA to work out, I admit) and substitute the values:
int x = 10;
int y = 100;
int z = ++x + (y++ * x);
1) ++x means "add one to x and use the new value", so x becomes 11 , and the calculation becomes
z = 11 + (y++ * x)
2) y++ means "Add one to y and use the old value", so y becomes 101 , and the calculation becomes
z = 11 + (100 * x)
3) We only have x left to worry about, so get the current value of it (which is 11 because we changed it in step 1) and the calculation becomes
z = 11 + (100 * 11)
Which is
z = 11 + 1100 Or
z = 1111
So the final result is:
x = 11, y = 101, z= 1111
This is a lot more complex than anything you should have to meet in "real life" (hence the discussion above about hitting people who do that kind of thing and why C++ will give you different results)
The universe is composed of electrons, neutrons, protons and......morons. (ThePhantomUpvoter)
|
|
|
|
|
okay, it is relieving I was only off by one
<a href="http://www.widmarkrob.com">My Coding Journey</a>
|
|
|
|
|
Welcome to the "I hit people who do that" club - your laminated membership card is in the post...
The universe is composed of electrons, neutrons, protons and......morons. (ThePhantomUpvoter)
|
|
|
|
|
This line is the important one:
int z = y-- + x;
it says to the computer, assign y + x into a variable called z. When you've done that knock one off the stored value of y.
so, in the line int z = y-- + x; z gets assigned with 100 + 10 (110) then y gets reduced to 99.
In the line z = --z + x;
The operation goes; knock one off z then assign the sum of z + x to z.
ie. take 1 off 110(z) to get 109; THEN assign 109+10 to z.
Basically if the ++ or -- is BEFORE the variable name (--y) then the operation is done BEFORE the rest of the line. But, if the ++ or -- is AFTER the variable name, the operation is done AFTER the rest of the line. Simples!
|
|
|
|
|
It's actually slightly more complicated, as I demonstrate here[^]
|
|
|
|
|
I know - BUT, why the hell would anyone write such a monstrosity.
Also, as it was clearly a beginner question, I was trying to simplify.
So you get 10/10 for correctness but 2/10 for being clear for the sake of the OP..
|
|
|
|
|
It would also matter in the cases of y = y++ + x; which OP is trying to understand..
|
|
|
|
|
wait a minute?
Who gets 10/10 for being correct?
OG or Me?
<a href="http://www.widmarkrob.com">My Coding Journey</a>
|
|
|
|
|
dynamic dynamicFail = (o1, e1) => { MessageBox.Show("store in 'dynamic"); };
var varFail = (o2, e2) => { MessageBox.Show("store in 'var"); }; However, you can assign a lambda to 'Action, or 'Func:
Action<dynamic,dynamic> myAction = (o3, e3) => { MessageBox.Show("Action works"); };
Func<dynamic, dynamic, string> myFunc = (o4, e4) => {return "Func works";}; In the MSDN docs, there is a comment on 'Func, that: Quote: The underlying type of any lambda expression is a Func. And, of course, in the MSDN docs for Lambda Expressions, you are told a lambda is an anonymous function "you can use to create delegates or expression tree types."
I am having trouble forming some kind of useful "mental model" about exactly what a lambda is, and how it can be used (in spite of having Skeet's 2nd. edition of "C# in Depth" at hand).
I know we can define an Event with a lambda: so, a lambda can become an EventHandler:
button1.Click += (obj, eva) => { MessageBox.Show("button1 clicked"); }; Where this "comes home to roost" for me is when I want to pass a lambda expression as a parameter to a method. You can certainly pass an Action<dynamic,dynamic> to a method, as a parameter:
private void MethodTakesAFunc(Func<dynamic, dynamic, string> theFuncParam){} While you can execute a passed in Func like this:
private void MethodTakesAFunc(Func<dynamic, dynamic, string> theFuncParam)
{
MessageBox.Show(theFuncParam(null, null));
} To me this way of getting execution by passing in null parameter stubs just seems absolutely weird: is there a simpler way ?
I see a similar problem with passing a lambda expression as a parameter to a method that then attempts to assign that lambda to an EventHandler.
Right now the only way I know to allow either an EventHandler, MouseEventHandler, or KeyPressHandler, to be passed in to a method, and then validly "wired up" to a Control's Event is something like this:
private void BindControlToClickEvent(Control theControl, dynamic theEventParam)
{
theControl.Click += theEventParam;
}
EventHandler myClickEvent = new EventHandler((obj, evn) => { MessageBox.Show("myClickEvent");});
BindControlToClickEvent(button2, myClickEvent); And that seems kind of "kinky."
I hope I have exposed enough of my confusion that diagnosis of my condition can proceed I'd really appreciate any guidance !
thanks, Bill
Humans are amphibians: half spirit, half animal; as spirits they belong to the eternal world; as animals they inhabit time. While their spirit can be directed to an eternal object, their bodies, passions, and imagination are in continual change, for to be in time, means to change. Their nearest approach to constancy is undulation: repeated return to a level from which they repeatedly fall back, a series of troughs and peaks.” C.S. Lewis
modified 28-Apr-13 1:18am.
|
|
|
|
|
It's just like the compiler told you... you can only "point" to a lambda via a delegate type. Dems da rules. Sorry.
BillWoodruff wrote: private void MethodTakesAFunc(Func<dynamic, dynamic, string> theFuncParam)
{
string evalFunc = theFuncParam.DynamicInvoke();
}
I don't get it... this works just fine:
private void MethodTakesAFunc(Func<dynamic, dynamic, string> theFuncParam)
{
string s = theFuncParam(someRandomVar1, someRandomVar2);
}
As for the uses of a lambda... well, some people "var them all up". What I mean by that is, I've seen a lot of C# code where people go hog wild with var...
var x = 0;
var y = new List<int>();
etc. Not what a var is intended for at ALL. I've seen people similarly write several page long functions in an inline lamda just cuz they are too lazy too create a function. Style wise, I think if your lambda code is < 5 lines or so, its fine to put it inline, but anything more then that it should be a separate function.
One trick you can do with lambdas is to change a methods signature. Typical UI event handlers are object sender, EventArgs e. Lets say you don't find any of those params useful, and you instead want to pass in a structure. That would require making that structure a class variable so the event handler can access it, but instead you can do:
button.Clicked += (x, y) => { MyEventHandler(someLocalObject); }
|
|
|
|
|
Thanks for your response, SledgeHammer01,
I've revised the section about which you commented, "I don't get it... this works just fine," in a way where I hope my sense of the weirdness of getting a passed in Func to evaluate is clearer.
I have no problem at all with the use of 'var as a way to save repetitious entry of complex object Types on "both sides" of an assignment statement: MS's documentation clearly tells you that is one of two primary uses 'var is for. The other use, of course, is to conveniently hold complex "unknown" Types returned by, for example, a Linq operation.
What I think is "bad practice," with using 'var, is to create a variable name that's not mnemonic, that doesn't "shout" at you, wherever you are in the code, what kind of object it contains, and/or how it's used, but you could say that about any variable name, imho.
Your example of "changing a method's signature" in a lambda used as an EventHandler is interesting, but I don't really see how you are in any way changing the signature of any method. In my view you are just inserting a call to another Method in the executable code body of the EventHandler. Perhaps if I saw your code that creates 'MyEventHandler, I'd "get" what you're demonstrating.
yours, Bill
Humans are amphibians: half spirit, half animal; as spirits they belong to the eternal world; as animals they inhabit time. While their spirit can be directed to an eternal object, their bodies, passions, and imagination are in continual change, for to be in time, means to change. Their nearest approach to constancy is undulation: repeated return to a level from which they repeatedly fall back, a series of troughs and peaks.” C.S. Lewis
|
|
|
|
|
I'm not sure what you are getting at with passing in nulls to execute the lamdba. If you have two dynamics as parameters to the function, that means you can pass anything into them, but you should pass something.
What I was demonstrating with changing the signature of a function is:
private void SomeMethod()
{
// random code here
// some more random code here
SomeComplexObject o = ...; // SomeComplexObject is built from the above random code
theButton.Click += MyEventHandler;
}
Ok, so without lamdas, how do you get "o" to MyEventHandler? You'd have to make it a class member, right? Seems lame to store a local object as a class member just for the sake of passing it to an event handler.
private void SomeMethod()
{
// random code here
// some more random code here
SomeComplexObject o = ...; // SomeComplexObject is built from the above random code
theButton.Click += (x, y) => { MyCoolerEventHandler(o); }
}
No, I didn't really "change the sig of the method" per say if you want to nitpick, but I passed o to my event handler in what I think is a much cleaner way then making it a class member.
One use of that is lets say you have a static object for whatever reason that has an event that takes an x & y. Without lamdas, you have no way to pass additional stuff into that function.
class MyClass
{
private static SomeClassWithEvents;
MyClass()
{
SomeClassWithEvents.theEvent += theHandler;
}
static void theHandler(x, y)
{
}
}
what if I want the handler to have access to SomeClassWithEvents... I'd either have to add a static "this" pointer:
static MyClass classPtr;
and init that.. or I could just do:
SomeClassWithEvents.theEvent += (x, y) => { theHandler(x, y, this); }
modified 28-Apr-13 2:13am.
|
|
|
|
|
You can't assign a lambda expression to a variable declared as var or dynamic because the compiler doesn't know whether you want an Action<> or an Expression<Action<>> .
Action<object> action = x => MessageBox.Show(x.ToString());
Expression<Action<object>> expression = x => MessageBox.Show(x.ToString());
var whatAmI = (object x) => MessageBox.Show(x.ToString());
You can help the compiler out with a few simple helper methods:
public static class Lambda
{
public static Action<T> Action<T>(Action<T> action)
{
return action;
}
}
var action = Lambda.Action((object x) => MessageBox.Show(x.ToString()));
dynamic myAction = Lambda.Action((dynamic x) => x.DoSomethingCool());
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
+5
Hi Richard,
Thanks very much for this tightly focused, very useful, response to my question ! I will be studying your code with great interest.
It's interesting to me I've never seen this information (that I can remember) in Jon Skeet's "C# in Depth," second edition; perhaps his upcoming 3rd. edition (due out sometime this summer) will cover this. I'm going to go take another look at the 2nd. edition today, to see if it has content on "Expression" that might, if I had understood it, in contrast with "Action," have cleared things up for me.
yours, Bill
Humans are amphibians: half spirit, half animal; as spirits they belong to the eternal world; as animals they inhabit time. While their spirit can be directed to an eternal object, their bodies, passions, and imagination are in continual change, for to be in time, means to change. Their nearest approach to constancy is undulation: repeated return to a level from which they repeatedly fall back, a series of troughs and peaks.” C.S. Lewis
|
|
|
|
|
I am running into a peculiar problem. I want to extract only date part from DateTime and pass the Date as DateTime datatype to stored procedure. I tried with the following code:
DateTime datetime = DateTime.Now.Date;
Console.WriteLine("Date is : " + datetime);
This is always returns with date and time as
4/27/2013 12:00:00 AM . I want only date, no time and should pass this as Date Datatype.
Even though I tried with lots of examples, I am able to do it if I convert to string which is not possible.
Is there any way which I can achieve this? Am I doing something wrong here?
|
|
|
|
|
Look at the name of the structure you're using: DateTime
The time component is not optional there. It will always have a time because the value for 12:00 AM is 0. There is no Date structure or class in .NET.
If you want to pass the date to a stored procedure, pass in a DateTime to a parameter of a parameterized query. When SQL evaluates a date, the time is still there even though it's not specified. Guess what time it is if it's not specified? Yeah, 12:00 AM.
You're basically trying to do something that you don't really need to do at all.
If you pass a DateTime into a, for example, SqlParameter object and the parameter type is defined as an SqlDbType.Date, the conversion is done automatically.
|
|
|
|
|
Besides the prior comment you should also be aware that MS SQL Server only has one data type 'Date' which only holds a date component.
If the database has a different data type then it will ALWAYS have a time component regardless of what you want. You might treat it like it doesn't, with care, but you better understand exactly how values go into and what impact timezones might have.
|
|
|
|
|
Olá pessoal, boa noite! estou com um probleminha simples, mais não estou conseguindo resolver,
preciso da ajuda de vocês!! Olha só no evento clique do meu datagridview eu tenho o código para jogar os dados nos textboxs apartir de um clique em uma linha...consigo fazer para todos os campos menos para o campo imagem, que no caso é um picturibox. agradeço qualquer ajuda...
segue o ex:
//exemplo que está correto
txtEstoqueAtual.Text = Convert.ToString(dataGridView1.CurrentRow.Cells[20].Value);
//exemplo que dá erro
|
|
|
|
|
The translation into English does not make any sense.
Post messages in English, use a good translation engine, check that reverse translation makes sense.
A tradução para o inglês não faz qualquer sentido.
Postar mensagens em Português, use um motor de boa tradução, verificar que a tradução inversa faz sentido.
Recomendar Bing
"It's true that hard work never killed anyone. But I figure, why take the chance." - Ronald Reagan
That's what machines are for.
Got a problem?
Sleep on it.
modified 26-Apr-13 21:00pm.
|
|
|
|
|
Hello guys, good night! I have a little problem Simple, More'm not getting resolved,
I need help from you! just look at the click event of my datagridview I have a code to play data in textbox starting from a click on a line ... can do for all fields, less than for the Image field, which in the case is a picturibox. I appreciate any help ...
/ / correct code
txtEstoqueAtual.Text = Convert.ToString(dataGridView1.CurrentRow.Cells[20].Value);
/ / This does not work for the image picturibox
//pctubImagemProd.Image = Convert.ToString(dataGridView1.CurrentRow.Cells[21].Value);
|
|
|
|
|
That still doesn't make any sense.
The code makes even less sense. You're converting the content of a DGV cell to a string and you expect that string to work in place of an Image object? Never going to happen.
I have no idea what that string represents. If it's a filepath to an image file, you have to load the image in order for it to be displayed in a control. It's not going to happen automatically.
|
|
|
|
|
Actually I do not avia realized it, the more I've sure could do with that format! was a mistake to send the code so ...
though of course unknown, but I figured averia somehow playing well in the picture from a different picturibox click the image in datagridview cell.
if someone has an idea I'm waiting ...
Thank you.
|
|
|
|
|
I have no idea what you're saying. Your English makes no sense at all.
|
|
|
|
|
You cannot use Convert.ToString to get an image; and why would you? The Value method returns an object, so you just need to cast it to the correct type.
Use the best guess
|
|
|
|
|