编译时的常量字段

时间:2014-04-09 09:42:12

标签: c# constants code-analysis fxcop

有没有办法在c#的编译时区分非常量字段和常量字段?

我目前正在开发c#代码分析(FxCop)规则,以检查开发人员的代码是否存在命名不一致。

我一直在寻找的是一种只定位常数字段的方法。但他们在编译时如何宣布?是否有旗帜(我一直在研究“HasDefault”,但这并没有给我太多信息)。

我使用的是FxCop-API(FxCopSdk.dll& Microsoft.Cci.dll)。没有使用反射。

总结:如何使用代码分析(FxCop)区分非常量字段和常量字段,以及如何定位常量。

3 个答案:

答案 0 :(得分:2)

进一步研究你提到的FxCop SDK,我找到了一个字段IsLiteral,它基本上是指在编译时指定了哪个值的成员。

这对你有用吗?

E.g

    public class ClassFieldNamePrefixes : BaseIntrospectionRule
    {
        public ClassFieldNamePrefixes() :
            base("ClassFieldNamePrefixes", "TutorialRules.TutorialRules",
                typeof (ClassFieldNamePrefixes).Assembly)
        {
        }

        public override ProblemCollection Check(Member member)
        {
            if (!(member.DeclaringType is ClassNode))
                return this.Problems;

            Field fld = member as Field;
            if (fld == null)
                return this.Problems;

            if (fld.IsLiteral && 
                fld.IsStatic && 
                field.Flags.HasFlag(FieldFlags.HasDefault))
            {
            ....
            }

            return this.Problems;
        }
    }

答案 1 :(得分:1)

如果我编译一些包含此类的程序集

namespace Foo
{
    public static class Bar
    {
        public int Pointless()
        {
            const int Whatever = 1;
            return Whatever;  
        }
    }
}
课程外无法访问

Whatever。我想,即使使用反射。事实上,它可以在IL中简化(这是猜想)。

Whatever的名称纯粹是一个样式问题,对编译的程序集没有影响。如果是public字段,例如

namespace Foo
{
    public static class Bar
    {
        public const int Whatever = 1;
    }
}

然后可以通过代码分析来分析名称。


鉴于公共非常量字段已经被

标记
  

CA1051: Do not declare visible instance fields

     

CA2211: Non-constant fields should not be visible

也许你根本不需要区分。

答案 2 :(得分:0)

我发现了一种有点肮脏的定位常量的方法。

使用以下内容将针对他们(但可能会给出误报):

Field field = member as Field;

if (field == null) 
    return null;
if (field.Flags.HasFlag(FieldFlags.HasDefault) && field.IsLiteral && Field.IsStatic)
{
  // Your code here.
}