Restituire StringBuilder se si desidera modificare ulteriormente la stringa, altrimenti restituire la stringa. Questa è una domanda API.
Riguardo all'efficienza. Poiché questa è una domanda vaga/generica senza specifiche, ritengo che mutable vs. immutable sia più importante della performance. La mutabilità è un problema dell'API che consente all'API di restituire oggetti modificabili. La lunghezza della stringa è irrilevante a questo.
Detto questo. Se si guarda a StringBuilder.ToString con riflettore:
public override string ToString()
{
string stringValue = this.m_StringValue;
if (this.m_currentThread != Thread.InternalGetCurrentThread())
{
return string.InternalCopy(stringValue);
}
if ((2 * stringValue.Length) < stringValue.ArrayLength)
{
return string.InternalCopy(stringValue);
}
stringValue.ClearPostNullChar();
this.m_currentThread = IntPtr.Zero;
return stringValue;
}
Si può vedere se può fare una copia, ma se si modifica con lo StringBuilder allora farà una copia allora (questo è quello che posso dire al punto di m_currentThread è perché Append verifica questo e lo copierà se non corrisponde al thread corrente).
Suppongo che la fine di questo è che se non si modifica StringBuilder, non si copia la stringa e la lunghezza è irrilevante per l'efficienza (a meno che non si prenda il 2 ° se).
UPDATE
System.String è una classe che significa che è un tipo di riferimento (al contrario di tipo valore) così "stringa foo;" è essenzialmente un puntatore. (Quando passi una stringa in un metodo passa il puntatore, non una copia.) System.String è mutabile dentro mscorlib ma immutabile al di fuori di esso, che è il modo in cui StringBuilder può manipolare una stringa.
Quindi, quando viene chiamato ToString(), restituisce l'oggetto stringa interno per riferimento. A questo punto non puoi modificarlo perché il tuo codice non è in mscorlib. Impostando il campo m_currentThread su zero, qualsiasi ulteriore operazione su StringBuilder causerà la copia dell'oggetto stringa in modo che possa essere modificato e senza modificare l'oggetto stringa restituito in ToString(). Considerate questo:
StringBuilder sb = new StringBuilder();
sb.Append("Hello ");
string foo = sb.ToString();
sb.Append("World");
string bar = sb.ToString();
Se StringBuilder non ha fatto una copia poi alla fine foo sarebbe "Ciao Mondo", perché lo StringBuilder modificato. Ma dal momento che ha fatto una copia, quindi foo è ancora solo "Ciao" e la barra è "Hello World".
Questo chiarisce l'intera faccenda di ritorno/riferimento?
@SkippyFire chiede efficienza. –
-1. Se stai andando a modificare ulteriormente la stringa, dovrebbe essere ulteriormente modificata all'interno del metodo. Cosa succede se questo metodo viene chiamato da più posti e la logica di manipolazione delle stringhe cambia? Non sarebbe bello aggiornare la logica in più punti. –
Nick, stai dividendo i capelli. Se questo è in una classe e in un metodo privato, si può benissimo passare lo StringBuilder a molti metodi per costruire la stringa finale. Potresti fare la stessa cosa quando ogni metodo restituisce una stringa e le concatena. SkippyFire non era specifico per come veniva usato. È piuttosto semplice: se hai bisogno di mutabile, restituisci mutabile, se non hai bisogno di mutabile allora non tornare mutabile. –