Как я могу пометить определенный параметр как устаревший / устаревший в C #? - PullRequest
16 голосов
/ 25 октября 2010

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

Ответы [ 5 ]

27 голосов
/ 25 октября 2010

Краткий ответ:

Вам потребуется создать новый nethod с новой подписью и пометить текущий как устаревший.

Более длинный ответ

То, чего вы хотите избежать любой ценой, - это разрыв кода!Затем, в частности, в рамках компании, вы хотите объявить, что ваш метод больше не будет поддерживаться, например, но вы не хотите нести ответственность за зависание различных решений из-за архитектуры или проектного решения или вашей стороны, верно?

Класс ObsoleteAttribute поможет вам.

Как только член класса, помеченный как устаревший, на стороне клиента будет выдано предупреждение,те, кто использует ваш фреймворк, чтобы продолжить этот путь, или даже один из ваших коллег по тому же проекту.

public class MyClass {
    [Obsolete("This method should no longer be used, please use MyNewMethod() instead.")]
    public void MyMethod(string name, long phoneNumber, long faxNumber) { 
    }

    public void MyNewMethod(string name, long phoneNumber, long faxNumber, string email) { 
    }
}

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

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

public class MyClass {
    [Obsolete("This method should no longer be used, please use MyNewMethod() instead.", true)]
    public void MyMethod(string name, long phoneNumber, long faxNumber) { 
    }

    public void MyNewMethod(string name, long phoneNumber, long faxNumber, string email) { 
    }
}

Установив для второго параметра конструктора класса ObsoleteAttribute значение true, вы сообщаете компилятору о том, как использовать этот метод в качествеrror.

Через некоторое время вы можете полностью удалить свой метод из кода, чтобы немного его очистить.Это часть методов рефакторинга, поддерживаемых методологией Agile Software Development.

Помогает ли это?

8 голосов
/ 25 октября 2010

С атрибутом «Устаревший»:

[Obsolete("Please use void AnotherMethod() instead", false)]
void SomeMethod(Int32 data){
}

Логическое значение в атрибуте указывает компилятору выдать предупреждение, если вы измените его на true, компилятор выдаст ошибку.См. здесь для документации по нему.

8 голосов
/ 25 октября 2010

Да, я думаю, что единственный способ - это создать новый метод без параметра и пометить оригинальный с помощью ObsoleteAttribute.

6 голосов
/ 25 октября 2010

Да.Вы можете только помечать типы и элементы типов как устаревшие , а не отдельные параметры.Однако вы можете перегрузить метод, сохранив то же имя и пометив старое как устаревшее:

class Act
{
    [Obsolete("DoSomething(int, int) is obsolete", false /*warn only*/)]
    public void DoSomething(int i, int j)
    {
    }

    public void DoSomething(int i)
    {
    }
}
2 голосов
/ 25 октября 2010

Я думаю, что было бы лучше создать новый метод.

Что вы имеете в виду, делая параметр устаревшим?Зависит ли это от конкретного значения этого аргумента?Когда вы вызываете метод, вы всегда должны указывать аргумент в любом случае.

...