Drew Moore wrote: > Jim Hugunin wrote: > > > >Because of the way that value types work, there's no difference between > >the results of > > apt[0].X = 0 and apt[0] = Point(0, apt[0].Y) > > > >The big question is how important it is that both of the following are > >equivalent. > > apt[0].X = 0 and tmp = apt[0]; tmp.X = 0 > > > Just curious, maybe I'm off base... > Is concurrency a concern here?
The answer to this question is almost always yes no matter what the context ;-) > Can instances of value types be shared between threads? (Perhaps > different languages?) There aren't really instances of value types. That's part of the problem. Value types are parts of other instances - either items in an array or inlined fields in classes. The things that hold value types can be shared between threads and languages. > If so, what if another thread is concurrently modifying a different > member of the underlying struct? This is a good point. In that case there is a potential difference between my two examples above. The one on the left can only change the X part of the point, but the one on the right could in theory overwrite another thread's changes to the Y part of the point. > If the client code 'just changes one attribute', but in actuality the > entire structure gets written back, it may make for some very > hard-to-pin-down bugs. > (if this might happen, maybe immutable value types aren't so bad.) I don't see this as too much of a problem. If IronPython supports apt[0].X=0, then that will only be implemented in such a way that just the X part is modified. If we decided to require apt[0]=Point(0,apt[0].Y) then it should be pretty clear to the programmer that they're replacing both fields of the point simultaneously. I just tried this in J# to see if there was a clever idea to steal. J# behaves just like the current IronPython does with value types: Form f = new Form(); System.out.println(f.get_ClientSize()); f.get_ClientSize().set_Height(10); System.out.println(f.get_ClientSize()); f.set_ClientSize(new Size(100, 100)); System.out.println(f.get_ClientSize()); {Width=292, Height=266} <-- starting size {Width=292, Height=266} <-- height unchanged by set_Height {Width=100, Height=100} <-- changed by setting to new Size object -Jim _______________________________________________ users-ironpython.com mailing list users-ironpython.com@lists.ironpython.com http://lists.ironpython.com/listinfo.cgi/users-ironpython.com