11

string.Formatには次のメソッドシグネチャがあります

string.Format(format, params, .., .. , ..);

毎回カスタムフォーマットを渡したい

string custFormat = "Hi {0} ... {n} ";   // I only care about numbers here, and want avoid  {abdb}
string name = "Foo";

string message = ProcessMessage(custFormat, name);

public string ProcessMessage(custFormat, name)
{
   return string.Format(custFormat, name);
}

例外を回避するために、ProcessMessageに渡す前にcustFormatの値を検証したいと思います。

4

4 に答える 4

21

このAPIが存在する場合は、それについて考えてみましょう。目標は、フォーマット文字列を事前に検証して、String.Formatスローされないようにすることです。

有効なフォーマットスロットを含まない文字列は、有効なフォーマット文字列であることに注意してください-置換を挿入しようとしない場合。

->したがって、置き換えると予想される数または引数を渡す必要があります

さまざまな特殊なフォーマットパターンがあり、それぞれが特定のタイプに対して特定の意味を持っていることに注意してください:http: //msdn.microsoft.com/en-us/library/system.string.format.aspx

String.Format引数の型と一致しないフォーマット文字列を渡してもスローされないように見えますが、そのような場合、フォーマッタは無意味になります。例えばString.Format("{0:0000}", "foo")

->したがって、このようなAPIは、引数のタイプも渡した場合にのみ本当に役立ちます。

すでにフォーマット文字列と型の配列を渡す必要がある場合(少なくとも)、基本的にはの署名にString.Formatなっているので、それを使用して例外を処理しないのはなぜですか?のようなものがあればいいのですString.TryFormatが、私の知る限りではありません。

また、一部のAPIを介して事前検証してから、それ自体を再検証するString.Formatことは、パフォーマンス的には理想的ではありません。

最もクリーンな解決策は、ラッパーを定義することだと思います。

public static bool TryFormat(string format, out string result, params Object[] args)
{
   try
   {
      result = String.Format(format, args);
      return true;
   }
   catch(FormatException)
   {
      return false;
   }
}
于 2012-08-24T15:57:36.890 に答える
0

custFormat引数を1つだけ渡す限り、検索を検索できます{0}。見つからない場合は無効です。

于 2012-08-24T15:23:23.247 に答える
0

情報をログに記録して処理を停止する場合を除いて、フォーマットがスローされた場合は、trycatchで検証できます。

try 
{ 
   string.Format(custFormat, params, .., .. , ..);
}
catch(FormatException ex)  
{ 
  throw ex;
}

string message = ProcessMessage(custFormat, name);
于 2012-08-24T15:23:48.600 に答える
-1

構文チェックには正規表現を使用する必要があり、セマンティックチェックも使用できます。

正規表現は次のようになります。(*{\d+}*)+

于 2012-08-24T15:23:08.403 に答える