[Mono-list] System.Collections.Stack
David Menestrina
dmenest@yahoo.com
Mon, 16 Jul 2001 11:59:29 -0700 (PDT)
Here are my comments. Take them with a grain of
salt because I've only been programming in C# for
a couple days. (But I do know Java, so that helps.)
- I think you're totally right that Stack can return
"this" for SyncRoot. Like you said, nobody will
ever see the internal Array.
- Maybe the whole thing should be implemented using
ArrayList.
- In Resize(), it might be faster to use
System.Array.Copy() instead of a loop.
- There are a couple of things in SyncStack that
probably don't need to be locked. For example:
> public override int Count {
> get { lock(this) { return count; } }
> }
Locking here is unnecessary because reading from
an int should be atomic. (It is in Java...)
- What happens if you do something like this:
Stack s1 = new Stack();
Stack s2 = Stack.Synchronized(s1);
s1.push(1);
s2.pop();
Should s2 be able to pop the element that was pushed
into s1? I think the MS implementation supports
this. (Guessing from playing with ArrayList.)
- Here's one way to solve the above problem, if
indeed it is a problem. Have SyncStack be a pure
wrapper class, that has one extra member, which is a
Stack.
All the methods are overridden to call the
same method on m_insideStack. The member variables
inherited from Stack are never used, which sucks,
but I don't know how to get around that.
Other than the fact that it solves the above
problem,
it has the benefit that you don't need member
variables for readonly and synchronized. You can
just have the base class return false for both, then
have the wrappers override it to return true.
SyncRoot, then would return
m_insideStack.SyncRoot().
Hope these comments are helpful,
david
__________________________________________________
Do You Yahoo!?
Get personalized email addresses from Yahoo! Mail
http://personal.mail.yahoo.com/