代码分析警告2214 - 最佳修复方法是什么?

8

I have the following code:

    public partial class AuditLog : IBusinessEntity
    {
        public BusinessEntityType EntityType { get { return BusinessEntityType.AuditLog; } }

        /// <summary>
        /// Constructor accepting parameter initialization arguments
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="entity"></param>
        /// <param name="command"></param>
        /// <param name="commandText"></param>
        public AuditLog(string userName, BusinessEntityType entity, AuditLogCommand command, string commandText)
        {
            this.Timestamp = DateTime.Now;
            this.UserName = userName;
            this.Entity = entity.ToString();
            this.Command = command.ToString();
            this.CommandText = commandText;
        }
    }

这会生成一个CA2214警告。方法参数BusinessEntityTypeAuditLogCommand都是枚举类型。我不确定问题所在,因此不确定如何满足警告。

谢谢。

1个回答

14

你的属性中是否有一个或多个是虚拟的?那么这就是CA2214是“不要在构造函数中调用可重写方法”的警告原因所在。

下面是源自MSDN对规则的解释:

当调用一个虚方法时,执行该方法的实际类型直到运行时才被选择。当构造函数调用一个虚方法时,调用该方法的实例的构造函数可能还没有执行。

这意味着,如果有人继承了你的类,并覆盖了在你的构造函数中访问的一个方法或属性,那么在继承类的构造函数运行之前,将会触发覆盖的实现。如果覆盖的实现依赖于构造函数中设置的状态,则可能会出现问题。

为满足此警告,你需要使在构造函数中访问的属性和方法不是虚拟的(如果适用,你可以将该类型标记为sealed)。


事实证明,“this.Entity”行有一个调用虚方法的setter。我想那就是问题所在。 - Randy Minder
是的,如果静态分析器能够看到在构造函数期间调用任何虚拟方法,则会触发警告。 - driis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接