2012-01-23 34 views
3

我有一个实现IPermission类:有没有办法在自定义System.Security.IPermission实现中修复此FxCop CA2103警告?

public class MySecurityPermission : IPermission 
{ 
    private string[] _demandRoles; 
    private string[] _denyRoles; 

    public MySecurityPermission(string[] demandRoles, string[] denyRoles) 
    { 
     this._demandRoles = demandRoles; 
     this._denyRoles = denyRoles; 
    } 
} 

现在,IPermission接口需要一个Copy()方法,我实现为:

public IPermission Copy() 
{ 
    return new MySecurityPermission(this._demandRoles.ToArray(), this._denyRoles.ToArray()); 
} 

注意,.ToArray()电话是有,因为它使关闭/复制数组,并返回一个新的数组实例,而不是传递相同的数组。

这导致FxCop的CA2103:

“评估,可能的安全漏洞如下: 在 'MySecurityPermission.Copy()',返回值来“Enumerable.ToArray呼叫 (这 IEnumerable的)”被传递到‘MySecurityPermission’ 构造“。

有没有办法来“修复”呢?我不确定为什么FxCop会抱怨。如果有人能解释它,那会很棒。

+1

如果将字段标记为'readonly',会发生什么? – vcsjones

+0

您的阅读乐趣多一点信息(不知道这是否会帮助):http://msdn.microsoft.com/en-us/library/ms182309(v=vs.100).aspx –

+0

@vcsjones - 这是我最初的反应也是如此,而且该接口还需要一个'FromXML()'方法,在这里我需要基于XML设置在这些阵列中的值,因此它们不能只读:( – CodingWithSpike

回答

3

这样看来,该规则被提出,因为代码被执行,其中的。如果您先创建变量,则规则将通过:

public IPermission Copy() 
{ 
    var demand = _demandRoles.ToArray(); 
    var deny = _denyRoles.ToArray(); 
    return new MySecurityPermission(demand, deny); 
} 
+1

啊,良好的通话。我开始尝试通过手动执行的'Array.Copy()'到一个新的变量,即传递给构造来代替。这也似乎工作,但您的解决方案是比较容易解决它自己。我很惊讶的FxCop看到的差异。我本来希望IL代码大致相同,谢谢! – CodingWithSpike

相关问题