代码协定:当封装需要方法且无法使用 String.Format 时格式不正确

本文关键字:String Format 不正确 格式 封装 方法 代码 | 更新日期: 2023-09-27 18:36:17

看起来DevLab的CodeContract是一个很好的工具,但我在代码中有两个错误:

public class SomeClass
{
   private DataTable _dataTable
   // I don't want to write the same condition more then ones, so incapsulate it
   private void CheckRowIndex(int rowIndex)
   {
      //Error1 in next line: User message to contract call can only be string literal, or a static
      // field, or static property that is at least internally visible.    
      Contract.Requires<IndexOutOfRangeException>(_dataTable.Rows.Count >= rowIndex + 1,
        String.Format("There is no row with index {0} in table.", rowIndex));
   }
   public object GetObject(int rowIndex, int colIndex)
   {
     // Error2 in next line: malformed contract
     CheckRowIndex();
     return _dataTable.Rows[rowIndex][colIndex];
   }
   public object GetObject(int rowIndex, string colName)
   {
     CheckRowIndex();
     return _dataTable.Rows[rowIndex][colName];
   }
}

有什么技巧可以避免它吗?

代码协定:当封装需要方法且无法使用 String.Format 时格式不正确

对于第 #1 点,请看这里

采用诸如 Requires(bool 条件、字符串 userMessage)等userMessage的合约重载要求userMessage消息是文字或静态的(例如 static readonly ),或const ,根据错误消息。

既然用户消息是给你的,开发人员,而不是用户,为什么不把它变成通用的:

String.Format("There is no row with this index in the table");

这里有更多关于在(IMO 命名不当的)userMessage 参数中放入什么的讨论