2016-07-08 13 views
3
public override void Write(byte[] buffer, int offset, int count) 
{    
    var bytesToWriteTotal = count; 

    while (bytesToWriteTotal > 0) 
    { 
     // If we do not have enough space in the cloud, we'll reserve more 
     var capacity = GetCurrentCapacity(); 
     var delta = Position + bytesToWriteTotal - capacity; 

     if (delta > 0) 
     { 
      Resize(2 * (capacity + delta)); 
     } 
     ... 

richtige Weg ist es, sicherzustellen, dass ich genügend Platz haben, oder sollte ich offset wie folgt hinzu:
var delta = Position + offset + bytesToWriteTotal - capacity;Wie reserviere ich mehr Platz mit Stream.Write?

+0

http://referencesource.microsoft.com/#mscorlib/system/io/memorystream.cs,a27df287b28d9a2a –

Antwort

2

nicht offset fügen Sie, ist es eine Position innerhalb des buffer, aus dem Sie anfangen zu lesen. Sie lesen count Zahlen, so dass Ihre Anzahl an Bytes zu schreiben ist. einmal

Sie sollten die Erweiterung tun, bevor die while Schleife:

var capacity = GetCurrentCapacity(); 
var delta = Position + count - capacity; 
if (delta > 0) { 
    Resize(2 * (capacity + delta)); 
} 
var bytesToWrite = count; 
while (bytesToWriteTotal > 0) { 
    ... 
} 

von zwei auf Resize Multipliziert man kann zu aggressiv sein, da Sie nur (capacity + delta) Bytes benötigen.

+0

Über Multiplikation. Ich denke, es ist eine gute Idee wegen der Komplexität. Sie sagten, dass wir die Größe um Delta erhöhen müssen. Wenn unsere n Operationen aus n Schreibvorgängen bestehen, entstehen Gesamtkosten von 1 + 2 + 3 + 4 .. + n = O (n^2) ' – Anatoly

+0

@Anatoly Wenn' Write' wiederholt aufgerufen wird, kennt der Aufrufer die total, und sollte 'Resize' aufrufen, bevor die Schleife aufgerufen wird und 'Write' aufgerufen wird. Es ist nicht einfach, die Aufrufmusterform innerhalb der Schreibmethode selbst zu erraten. – dasblinkenlight

Verwandte Themen