Интуитивно понятно, что вызов String.Format
дважды повлечет за собой удвоение эксплуатационных расходов. В этой демонстрации вы увидите промежуточный язык, сгенерированный кодом, аналогичным тому, что вы делаете. Вы можете видеть, что дважды "работа" выполняется после then ...
. Разница ничтожна. Кроме того, компилятор может выполнять оптимизации, которые неочевидны, поэтому всегда рекомендуется проводить сравнительный анализ, если есть обоснованная озабоченность по поводу производительности.
Если вы действительно хотите кодировать эффективную запись в журнал и обмен сообщениями, я предлагаю использовать специально предназначенную для этого библиотеку. Нечто подобное Serilog можно настроить для записи в несколько «приемников». Таким образом, один вызов для записи сообщения может go на консоль, и файл, и электронное письмо, и конечную точку http, et c., Et c.
string msg = string.Format("Error: {0}", "test");
Console.WriteLine(msg);
Debug.WriteLine(msg);
Debug.Write("then...");
Console.WriteLine(string.Format("Error: {0}", "test"));
Debug.WriteLine(string.Format("Error: {0}", "test"));
IL_0000: nop
IL_0001: ldstr "Error: {0}"
IL_0006: ldstr "test"
IL_000B: call System.String.Format
IL_0010: stloc.0 // msg
IL_0011: ldloc.0 // msg
IL_0012: call System.Console.WriteLine
IL_0017: nop
IL_0018: ldloc.0 // msg
IL_0019: call System.Diagnostics.Debug.WriteLine
IL_001E: nop
IL_001F: ldstr "then..."
IL_0024: call System.Diagnostics.Debug.Write
IL_0029: nop
IL_002A: ldstr "Error: {0}"
IL_002F: ldstr "test"
IL_0034: call System.String.Format
IL_0039: call System.Console.WriteLine
IL_003E: nop
IL_003F: ldstr "Error: {0}"
IL_0044: ldstr "test"
IL_0049: call System.String.Format
IL_004E: call System.Diagnostics.Debug.WriteLine
IL_0053: nop
IL_0054: ret