struct Pricer
{
public double Price;
public long Size;
public void AddExecution(long lastSize, double lastPrice)
{
Price = (Price * Size + lastSize * lastPrice) / (Size + lastSize);
Size += lastSize;
}
}
class PriceData
{
public Pricer pricer;
}
class Program
{
static void Main(string[] args){
Pricer price = new Pricer{Price = 0.0, Size = 0};
for (int i = 0; i < 5; ++i)
{
Console.WriteLine("{0} {1}", price.Price, price.Size);
price.AddExecution(1, 2.5 * (i + 1));
}
for (int i = 0; i < 5; ++i)
{
Console.WriteLine("{0} {1}", price.Price, price.Size);
price.Price= 2.5 * (i + 1);
}
PriceData priceData = new PriceData();
priceData.pricer = price;
for (int i = 0; i < 5; ++i)
{
Console.WriteLine("{0} {1}", price.Price, price.Size);
priceData.pricer.AddExecution(1, 2.5 * (i + 1));
}
}
}
Eric Lippert tells us about mutating *readonly* structs: http://blogs.msdn.com/b/ericlippert/archive/2008/05/14/mutating-readonly-structs.aspx but even non-readonly structs can get us in a mess.