当前位置:  开发笔记 > 编程语言 > 正文

自定义编译器警告

如何解决《自定义编译器警告》经验,为你挑选了6个好方法。

在.Net中使用ObsoleteAtribute时,它会为您提供编译器警告,告诉您对象/方法/属性已过时,应该使用其他东西.我目前正在开发一个需要大量重构前雇员代码的项目.我想编写一个自定义属性,我可以用它来标记将生成编译器警告的方法或属性,这些警告会给出我写的消息.像这样的东西

[MyAttribute("This code sux and should be looked at")]
public void DoEverything()
{
}

Public Sub DoEverything()
End Sub

我想要生成一个编译器警告,上面写着"这段代码sux,应该看一下".我知道如何创建自定义属性,问题是我如何使它在visual studio中生成编译器警告.



1> Pablo Fernan..:

不知道这是否有效,但值得一试.

你不能扩展Obsolete,因为它是最终的,但也许你可以创建自己的属性,并将该类标记为过时,如下所示:

[Obsolete("Should be refactored")]
public class MustRefactor: System.Attribute{}

然后,当您使用"MustRefactor"属性标记方法时,可能会显示编译警告.

我说"也许"和"可能"因为我没试过这个.请告诉我,如果它不起作用,我将删除答案.

问候!

更新:测试它.它会生成编译时警告,但错误消息看起来很有趣,您应该亲眼看到并选择.这非常接近您想要实现的目标.

更新2:使用此代码它会生成此警告(不是很好,但我不认为有更好的东西).

public class User
{
    private String userName;

    [TooManyArgs] // Will show warning: Try removing some arguments
    public User(String userName)
    {
        this.userName = userName;   
    }

    public String UserName
    {
        get { return userName; }
    }
    [MustRefactor] // will show warning: Refactor is needed Here
    public override string ToString()
    {
        return "User: " + userName;
    }
}
[Obsolete("Refactor is needed Here")]
public class MustRefactor : System.Attribute
{

}
[Obsolete("Try removing some arguments")]
public class TooManyArgs : System.Attribute
{

}



2> Douglas Mayl..:

在某些编译器中,您可以使用#warning发出警告:

#warning "Do not use ABC, which is deprecated. Use XYZ instead."

在Microsoft编译器中,您通常可以使用消息编译指示:

#pragma message ( "text" )

你提到过.Net,但没有说明你是用C/C++还是用C#编程.如果您使用C#进行编程,那么您应该知道C#支持#warning格式.



3> Ted Elliott..:

我们目前正处于大量重构的中间,我们无法立即解决所有问题.我们只需使用#warning preproc命令,我们需要返回并查看代码.它出现在编译器输出中.我不认为你可以把它放在一个方法上,但是你可以把它放在方法里面,而且它仍然很容易找到.

public void DoEverything() {
   #warning "This code sucks"
}



4> ljs..:

更新

现在可以使用Roslyn(Visual Studio 2015).你可以建立一个代码分析器来检查自定义属性


我不相信这是可能的.ObsoleteAttribute由编译器专门处理,并在C#标准中定义.为什么ObsoleteAttribute不被接受?在我看来,这正是它所针对的情况,并准确地实现了您的需求!

另请注意,Visual Studio也会即时获取由ObsoleteAttribute生成的警告,这非常有用.

不要意味着无益,只是想知道你为什么不热衷于使用它...

不幸的是,ObsoleteAttribute是密封的(可能部分是由于特殊处理),因此您无法从中继承自己的属性.

从C#标准: -

属性Obsolete用于标记不再使用的类型和类型成员.

如果程序使用使用Obsolete属性修饰的类型或成员,则编译器会发出警告或错误.具体而言,如果未提供错误参数,或者提供了错误参数且值为false,则编译器会发出警告.如果指定了error参数并且值为true,则编译器会发出错误.

这不能总结你的需求吗?......你不会做得比我想象的更好.


我正在寻找同样的事情.过时的"作品"但由于重构,代码并没有真正过时.
我同意@g,可能是原作者.过时意味着过时,不要使用.我想标记一些东西,"嘿,这编译,但我们真的需要a)完成功能或b)重构".它更像是一个开发时间属性.任务也工作,例如// TODO:,但我不使用那些,因为我猜很多人没有,但是会定期查看编译器警告.
不使用`[Obsolete]`标签的另一个原因是,如果你需要对属性进行XmlSerialization,可能会导致问题.添加`[Obsolete]`标签也会在幕后添加`[XmlIgnore]`属性.
过时是不同的.过时会在调用该方法的每行代码上发出警告.我不认为这就是海报想要的东西(至少当我进行搜索并发现这个问题时,这不是我想要的).我认为问题所在的是警告,以显示函数的定义,而不是它被使用的地方.

5> Tomasz Model..:

在VS 2008中(+ sp1)#warnings在Clean Soultion&Rebuild Solution之后的错误列表中没有正确显示,并非全部.仅在打开特定类文件后,错误列表中会显示一些警告.所以我被迫使用自定义属性:

[Obsolete("Mapping ToDo")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)]
public class MappingToDo : System.Attribute
{
    public string Comment = "";

    public MappingToDo(string comment)
    {
        Comment = comment;
    }

    public MappingToDo()
    {}
}

所以当我用它标记一些代码时

[MappingToDo("Some comment")]
public class MembershipHour : Entity
{
    // .....
}

它会产生如下警告:

Namespace.MappingToDo已过时:'Mapping ToDo'.

我无法更改警告的文字,"有些评论"未显示错误列表.但它会跳到文件中的适当位置.因此,如果您需要更改此类警告消息,请创建各种属性.



6> 小智..:

你要做的是滥用属性.而是使用Visual Studio任务列表.您可以在代码中输入注释,如下所示:

//TODO:  This code sux and should be looked at
public class SuckyClass(){
  //TODO:  Do something really sucky here!
}

然后从菜单中打开"查看/任务列表".任务列表有两个类别,用户任务和注释.切换到评论,你会看到你的所有// Todo:那里.双击TODO将跳转到代码中的注释.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有