Delegate call in solidity is somehow tricky. It is basically executed in the context of the calling contract that creates a couple of unexpected behaviors. As an example, considering the following contracts, calling setN is executed in the context of D, meaning that _n variable of D will be set and not for E! Another feature is that msg.sender and msg.value do not change values.
contract D{
uint public n = 0;
function delegateCallTest(address _e, uint _n) {
_e.delegatecall(bytes4(sha3("setN(uint256)")), _n);
}
}
contract E{
uint public n = 0;
function setN(uint _n) {
n = _n;
}
}