|
System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
string decimalSeparator = ci.NumberFormat.CurrencyDecimalSeparator;
Dave
|
|
|
|
|
There's also ...CurrentCulture.NumberFormat.NumberDecimalSeparator
Dave
|
|
|
|
|
If we have a value type, we can force it to be passed by reference using the ref keyword.
Is it possible to do the inverse - pass a reference type by value?
At the moment my class creates a sort of shadow of itself as a struct and passes the struct to acheive this, but I'm sure there's a better way. I looked at cloning but the shallow/deep issues seemed to be more trouble than they were worth!
Dave
|
|
|
|
|
It's easy to get confused by this.
If you try to forcable pass a value type by reference, what is happening behind the scences is the value type is being stuck in a reference type box (refereed to as being 'boxed') and it is a reference to this box that is passed.
With a reference type what you have is actually a pointer (or reference) to the object that is stored in the heap. By default you pass that pointer _by value_. You are already passing a pointer to a reference type by value.
(If you add the ref keyword, you will be then passing a pointer to a reference type by reference. Therefore you end up passing a reference to a reference.)
It isn't possible to pass a reference type by value because the object only exists on the heap. If you create a struct the struct will only contain a pointer to the reference type on the heap, so passing the struct by value will still provide the same pointer to the same object on the heap.
The only way to really achive this effect is to do some form of deep copy the object and pass that instead.
Why do you want to pass a reference type by value?
Simon
|
|
|
|
|
Simon Stevens wrote: If you try to forcable pass a value type by reference, what is happening behind the scences is the value type is being stuck in a reference type box (refereed to as being 'boxed') and it is a reference to this box that is passed.
No, passing a value type by reference doesn't use boxing. If it would, the method would change the boxed copy instead of the original.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Good point, my mistake. it passes a pointer to the original value type (which I'm assuming is on the in the stack frame of the original method).
Simon
|
|
|
|
|
Yes, if the variable is a local variable in a method, it's in the stack frame.
If it's a member variable in an object, it has to send a reference instead. Or perhaps fix the object to keep the GC from moving it, so that it can send a pointer to the member.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks Simon.
Simon Stevens wrote: Why do you want to pass a reference type by value?
I pass an object that's part of a collection. The object needs to be editable, but not updated in the collection until later depending on certain criteria (sometimes much later after several significant changes have been made at different points).
As I said, I've found a workaround, but wondered if there was an easier/better way.
Dave
|
|
|
|
|
It sounds like your talking about some kind of transactionalised editing.
I.e, you pass the collection of objects to a form, allow the user to edit and make changes, but if they click cancel you want to roll back the changes, but if they click ok, you commit the changes to the objects.
Several options.
1) Just make the changes on the objects immediatly, but if the criteria occurs that requires a cancel, reload the objects from their original source (i.e. the database)
2) Take a copy of the objects, make the changes on the copies, only commit the changes to the main objects when the criteria occurs that requires a commit. (Sounds pretty much like what you are doing already with the structs)
3) Take a copy, make the changes on the original, restore the originals from the copies if a rollback is required.
4) Record all changes to the object, if a rollback is required, reverse the changes one by one.(kind of like an undo button)
Simon
|
|
|
|
|
Why would you want to do that?
|
|
|
|
|
|
|
DaveyM69 wrote: I looked at cloning but the shallow/deep issues seemed to be more trouble than they were worth!
Use BinaryFormatter class and serialize the object to a MemoryStream instance. Create a new object and deserialize the MemoryStream and return. But this method is slow. BTW, why do you want to pass reference types as value ?
|
|
|
|
|
N a v a n e e t h wrote: BTW, why do you want to pass reference types as value ?
here[^]
Dave
|
|
|
|
|
DaveyM69 wrote: pass a reference type by value
All references are passed by value.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Dave
|
|
|
|
|
CPallini wrote: All references are passed by value. [Big Grin]
Naturally. A reference is a value type.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Guffa wrote: A reference is a value type
I didn't got it. Can you explain ?
|
|
|
|
|
|
DaveyM69 wrote: I looked at cloning
Most objects that have a "clone" method also have a "copy" method I believe. That might do what you want?
|
|
|
|
|
|
Lol, maybe you should reply that to the one who needs it
|
|
|
|
|
static void Main(string[] args)
{
Glut.glutInit();
I get a runtime error here "Cannot find freeglut.dll", while I downloaded this example code from the Code Project website.
I installed SDLdotNet runtime environment, and the Tao.OpenGL and Tao.FreeGlut References are available in the solution.
I haven't got a clue as to what is going wrong here, can someone tell me?
Did I post this message in the right area?
Ranger49
|
|
|
|
|
The first thing to try is putting freeglut.dll in the same folder as your .exe.
|
|
|
|
|
Alan Balkany wrote: The first thing to try is putting freeglut.dll in the same folder as your .exe.
But 1) freeglut.dll was not in the SDL-sdk-win32-exe that I installed. And 2) I am using VC#2008 which works with .NET and I don't think VC#2008EE generates executables.
Thanks so much for telling me this, but I think I already tried this...
Ranger.
|
|
|
|