Pergunta

Eu estou tentando implementar um método C # que pode registrar uma mensagem com uma seqüência de formato e um número variável de argumentos de estilo printf. Idealmente, ele iria trabalhar de forma idêntica à função C I colado abaixo, embora idiomática para C # é claro.

static
void
LogMessage(const char * iFormat, ...)
{
  va_list argp;
  FILE * fp;

  fp = fopen("log.txt", "a");
  if (fp != NULL) {
    va_start(argp, iFormat);
    vfprintf(fp, iFormat, argp);
    va_end(argp);
    fprintf(fp, "\n");
    fclose(fp);
  }
}

Esta função é conveniente para mim, pois me permite fazer as seguintes chamadas:

LogMessage("Testing");
LogMessage("Testing %s", "1 2 3");
LogMessage("Testing %d %d %d", 1, 2, 3);
Foi útil?

Solução

static void LogMessage(string format, params object[] args) {
    File.AppendAllText("log.txt", string.Format(format, args));
}

LogMessage("Testing {0} {1}", 1, "hi");

Outras dicas

Você deseja criar um função variádica

C # usa o params palavra-chave para fazer isso

static void LogMessage(string formatString, params string[] formatArguments)
{
    string.Format(formatString, formatArguments);
}

Por favor, note que os params palavra-chave só podem ser usados ??no última parâmetro na assinatura do método e que requer o parâmetro a ser um array .

Este é o açúcar apenas sintático para realmente passar um array.

static void LogMessage(params string [] logList)
{
    for ( int i = 0 ; i < logList.Length ; i++ )
       doLogging(logList[i]);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top