Пользовательские предупреждения компилятора

110
задан Gabor 16 July 2018 в 03:22
поделиться

7 ответов

Обновление

Это теперь возможно с Рослином (Visual Studio 2015). Вы можете сборка анализатор кода для проверки на пользовательский атрибут

<час>

, я не полагаю, что это возможно. ObsoleteAttribute рассматривает особенно компилятор и определяют в стандарте C#. С какой стати ObsoleteAttribute не приемлем? Это кажется мне как это, точно ситуация, это было разработано для и достигает точно, чего Вы требуете!

Также примечание, что Visual Studio берет предупреждения, сгенерированные ObsoleteAttribute на лету также, который очень полезен.

не означают быть бесполезным, просто задавшись вопросом, почему Вы не увлечены использованием его...

, К сожалению, ObsoleteAttribute изолируется (вероятно, частично из-за специального режима) следовательно, Вы не можете разделить свой собственный атрибут на подклассы от него.

От C# standard:-

Устаревший атрибут используется для маркировки типов и членов типов, которые больше не должны использоваться.

, Если программа использует тип или участника, который украшен Устаревшим атрибутом, компилятор выпускает предупреждение или ошибку. А именно, компилятор выпускает предупреждение, если никакой параметр ошибок не обеспечивается, или если параметр ошибок обеспечивается и имеет ложь значения. Компилятор выпускает ошибку, если параметр ошибок определяется и имеет верное значение.

, который не подводит итог Ваших потребностей?... Вы не собираетесь добиваться большего успеха, чем это, я не думаю.

25
ответ дан jpaugh 24 November 2019 в 03:13
поделиться

Не знайте, будет ли это работать, но это стоит попытки.

Вы не можете расшириться Устаревший, потому что его финал, но возможно можно создать собственный атрибут и отметить тот класс как устаревший как это:

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

Тогда при маркировке методов с атрибутом "MustRefactor" предупреждения компиляции могли бы показать.

я сказал, "возможно", и "могли бы", потому что я не попробовал это. Скажите мне, если это не будет работать так, то я удалю ответ.

Отношения!

ОБНОВЛЕНИЕ: Протестированный это. Это генерирует время компиляции, предупреждая, но сообщение об ошибке выглядит забавным, необходимо видеть его для себя и выбрать. Это очень близко к тому, чего Вы хотели достигнуть.

UPDATE2: С этот код Это генерирует это предупреждения (не очень хороший, но я не думаю, что существует что-то лучше).

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
{

}
94
ответ дан Alexei Levenkov 24 November 2019 в 03:13
поделиться

В некоторых компиляторах можно использовать #warning для издания предупреждения:

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

В компиляторах Microsoft, можно обычно использовать прагму сообщения:

#pragma message ( "text" )

Вы упомянули.Net, но не определили, программировали ли Вы с C/C++ или C#. Если Вы программируете в C#, чем необходимо знать, что C# поддерживает #warning формат .

44
ответ дан Douglas Mayle 24 November 2019 в 03:13
поделиться

Мы в настоящее время посреди большого рефакторинга, где мы не могли зафиксировать все сразу же. Мы просто используем #warning preproc команда, куда мы должны возвратиться и посмотреть на код. Это обнаруживается в выходе компилятора. Я не думаю, что можно поместить его в метод, но Вы могли поместить его только в методе, и все еще легко найти.

public void DoEverything() {
   #warning "This code sucks"
}
38
ответ дан Ted Elliott 24 November 2019 в 03:13
поделиться

Я не думаю, что Вы можете. Насколько я знаю, что поддержка ObsoleteAttribute по существу hardcoded в компилятор C#; Вы не можете сделать ничего подобного непосредственно.

то, Что Вы могли бы быть в состоянии сделать, использовать задачу MSBuild (или событие постсборки), который выполняет инструмент пользователя против просто скомпилированного блока. Инструмент пользователя отразился бы по всем типам/методам в блоке и использовал бы Ваш пользовательский атрибут, в которой точке это могло распечатать к Системе. Значение по умолчанию или ошибка консоли TextWriters.

2
ответ дан technophile 24 November 2019 в 03:13
поделиться

Смотря на источник для ObsoleteAttribute, не похоже, что это делает что-либо специальное для генерации предупреждения компилятора, таким образом, я был бы склонен идти с технофил и говорить, что это трудно кодируется в компилятор. Существует ли причина, которую Вы не хотите просто использовать ObsoleteAttribute для генерации предупреждающих сообщений?

2
ответ дан Community 24 November 2019 в 03:13
поделиться

в VS 2008 (+ SP1) #wnorings don ' T покажет должным образом в списке ошибок после чистоты SULLION & REBUBILD SLICE, нет всех них. Некоторые предупреждения показаны в списке ошибок только после открытия определенного файла класса. Итак, я был вынужден использовать пользовательский атрибут:

[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.mappeTODO устарел: «Карт Тодо».

Я не могу изменить текст предупреждения, «какой-то комментарий» не отображается его списком ошибок. Но он будет прыгать в правильное место в файле. Таким образом, если вам нужно варианты таких предупреждающих сообщений, создайте различные атрибуты.

7
ответ дан 24 November 2019 в 03:13
поделиться