Le migliori pratiche per l'utilizzo di StringBuilder

3

Sto scrivendo un programma di controllo della fotocamera che utilizza molti metodi per ciascuno dei diversi comandi.

Un esempio è:

public void CameraPan(int Id, string Direction, int Speed)
{
    StringBuilder sb = new StringBuilder();
    sb.Append(_cameraRamp); //command to camera - start moving
    sb.Append(_camID);
    sb.Append(Convert.ToString(Id));
    sb.Append(_pan); //command to camera - this is a pan
    sb.Append(Direction);
    sb.Append(_panSpeed); //command to camera - speed to move at
    sb.Append(Convert.ToString(Speed));
    _sendCommand = sb.ToString();
    SendToCamera(_sendCommand);
}

La mia domanda: è la migliore prassi per creare un'istanza di un nuovo StringBuilder per ogni metodo o costruire uno StringBuilder per la classe e utilizzarlo in tutto?

Mi sembra che se ne usassi uno in tutto il mondo ci sarebbero meno risorse impegnate. D'altra parte, il GC non dovrebbe semplicemente disporre di ogni istanza quando il metodo non viene più utilizzato?

    
posta Norm Schaeffer 16.03.2016 - 20:55
fonte

2 risposte

11

Crea un'istanza di StringBuilder per ogni metodo.

Ecco perché:

  1. Incapsulamento. Poiché ogni metodo ha il proprio oggetto StringBuilder che controlla, non deve preoccuparsi di qualcos'altro che monkeying con il suo stato StringBuilder .

  2. StringBuilder s sono oggetti economici da istanziare, molto meno costosi di concatenare le stringhe.

La condivisione di un oggetto globale StringBuilder creerà un fertile terreno fertile per tutti i tipi di bug sottili, insidiosi e difficili da risolvere, specialmente se stai cercando di rimanere protetto da thread.

    
risposta data 16.03.2016 - 20:59
fonte
5

Usa un nuovo StringBuilder ogni volta che hai bisogno di un nuovo StringBuilder.

Qualsiasi altra cosa probabilmente sta rompendo l'incapsulamento e ti lascia aperto agli effetti collaterali indesiderati della condivisione di un oggetto.

Inoltre, suggerirei di usare AppendFormat () invece di Append ().
Stai costruendo una stringa abbastanza complessa (e, presumo, sensibile al formato) qui, quindi bloccare la formattazione in modo esplicito ti farà risparmiare mal di testa in seguito.

sb.AppendFormat("{0}{1}{2:0}{3}{4}{5:0}" 
   , _cameraRamp  /* start moving */ 
   , _camID
   , Id 
   , _pan         /* this is a pan */ 
   , Direction  
   , _panSpeed    /* speed to move at */ 
   , Speed 
   ); 

_sendCommand = sb.ToString();

SendToCamera(_sendCommand);
    
risposta data 17.03.2016 - 13:22
fonte

Leggi altre domande sui tag