У меня есть два метода, которые являются перегрузками друг друга
public class Car
{
public int GetPrice(string vinNumber)
{
string make = Database.GetMake(vinNumber); // expensive operation
string model = Database.GetModel(vinNumber); // expensive operation
int year = Database.GetYear(vinNumber); // expensive operation
return this.GetPrice(make, model, year);
}
public int GetPrice(string make, string model, int year)
{
// Calculate value and return
}
}
В моем примере, GetPrice (делают, моделируют, год), перегрузка является дешевой для выполнения, но GetPrice (vinNumber) метод является дорогим. Проблема состоит в том, что дорогой метод имеет наименьшее количество параметров, и это обнаруживается сначала в C# intellisense.
Оба метода действительны, но я хочу поощрить людей называть дешевый метод. Но люди склонны не просматривать все перегрузки в Intellisense прежде, чем выбрать метод для вызова, и дорогой называют слишком часто в кодовой базе моей компании.
Существует ли способ сказать Visual Studio отдавать "intellisense приоритет" конкретному методу, таким образом, это обнаруживается сначала?
Не думаю.
Если только вы не напишете плагин intellisense (например, Resharper) и не взломаете intellisense по умолчанию и не создадите программу для пользователей, чтобы назначить приоритет.
Вы можно украсить метод тегом Obsolete, который также будет генерировать предупреждение или ошибку в зависимости от настроек.
[System.Obsolete ("используйте GetPrice (марка, модель, год)")]
Происходит следующее:
Вы могли бы подумать о том, чтобы вместо перегрузки назвать элементы одинаковыми в начале и разными в end ( GetMake
vs GetMakeSlow
, но, очевидно, что-то лучше этого), поэтому они отображаются вместе в Intellisense, но сообщается, что вы должны использовать.
В противном случае сделайте их настоящими перегрузками, но используйте документацию XML, чтобы поставить четкое предупреждение о медленном.
Единственное решение, которое я могу предложить, - это комментарии, но это не значит, что пользователь обратит на них внимание:
/// <summary>
/// This method should be used as a last resort...
/// </summary>
/// <param name="vinNumber"></param>
/// <returns></returns>
public int GetPrice(string vinNumber)
{
...
}
/// <summary>
/// This is the preferred method...
/// </summary>
/// <param name="make"></param>
/// <param name="model"></param>
/// <param name="year"></param>
/// <returns></returns>
public int GetPrice(string make, string model, int year)
{
...
}
Изменить: Я пробовал это, но это не имело никакого значения :
class Class1
{
public static void Method(int value1) { }
public static void Method(int value1, int value2) { }
public static void Method(int value1, int value2, int value3) { }
}
class Class2
{
public static void Method(int value1, int value2, int value3) { }
public static void Method(int value1, int value2) { }
public static void Method(int value1) { }
}