代码之家  ›  专栏  ›  技术社区  ›  Scott Arrington

当用作方法参数的前缀时,“this”是什么意思?

  •  6
  • Scott Arrington  · 技术社区  · 15 年前

    我确信答案是显而易见的,我有点不好意思我还不知道答案,但是考虑一下我在阅读“专业的ASP.NET MVC 1.0”时收集到的以下代码示例:

    public static class ControllerHelpers
    {
        public static void AddRuleViolations(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors)
        {
            foreach (RuleViolation issue in errors)
                modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
        }
    }
    

    我知道这个静态方法在做什么,但我不知道“this”这个词在方法签名中的作用是什么。有人能启发我吗?

    5 回复  |  直到 15 年前
        1
  •  17
  •   tanascius    15 年前

    这是一个新的C 3.0功能,名为 extension method .

    这意味着,您将向ModelStateDictionary对象添加一个新方法。您可以像普通方法一样调用它:

    yourModelStateDictionary.AddRuleViolations( errors );
    

    请参见,跳过第一个参数(“this”-参数)。它只将ModelStateDictionary指定为扩展方法的有效目标。

    提示是,您可以对任何类(甚至是密封类或第三方类)执行此操作,例如.NET框架类(例如在对象或字符串上)。

        2
  •  1
  •   C. Ross trotttrotttrott    15 年前

    它意味着所讨论的方法是一个“扩展方法”,可以像调用类本身的方法一样调用它。看看这个 article .

        3
  •  1
  •   J.W.    15 年前

    它是一个扩展方法签名,它意味着“addRuleViolations”将被视为ModelStateDictionary的扩展方法。

    来自MSDN。

    扩展方法使您能够“添加” 方法到 现有类型 没有 创建新的派生类型, 重新编译或以其他方式修改 原始类型。扩展方法 是一种特殊的静态方法, 但他们被称为 扩展类型上的实例方法。 对于用C和 Visual Basic,没有明显的 调用 扩展方法和 实际上是在一个类型中定义的。

        4
  •  0
  •   Dave Van den Eynde    15 年前
        5
  •  0
  •   PatrikAkerstrand    15 年前

    它增加了一个 extension method 到ModelStateDictionary的所有实例。