Can-visualstudio';s C#intellisense会得到提示,首先显示某个方法重载吗?

Can-visualstudio';s C#intellisense会得到提示,首先显示某个方法重载吗?,c#,visual-studio,intellisense,overloading,C#,Visual Studio,Intellisense,Overloading,我有两个互相重载的方法 public class Car { public int GetPrice(string vinNumber) { string make = Database.GetMake(vinNumber); // expensive operation string model = Database.GetModel(vinNumber); // expensive operation int year = Databas

我有两个互相重载的方法

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(make、model、year)重载执行起来很便宜,但是GetPrice(vinNumber)方法执行起来很昂贵。问题在于,昂贵的方法参数最少,而且它首先出现在C#intellisense中

这两种方法都是有效的,但我想鼓励人们称之为廉价方法。但是,人们在选择调用方法之前,往往不会查看Intellisense中的所有重载,而且昂贵的方法在我公司的代码库中被调用的次数太多

有没有一种方法可以告诉VisualStudio将“智能感知优先级”赋予某个特定的方法,以便它首先显示出来?

不这么认为

除非您编写intellisense插件(如Resharper)并劫持默认intellisense并创建一个程序供用户分配优先级。

发生的情况如下:

  • 当您键入成员或在列表中高亮显示它时,您看到的单个重载就是代码中首先列出的重载
  • 接受成员并位于括号内后,顺序似乎基于参数的数量,从最少到最多

你可以考虑的是,不是重载,而是在开始时把成员命名为同一个,而在结尾时不同(<代码> GETFAX <代码> VS <代码> GetMakeSlow < /代码>,但显然比这更好一些),所以它们在智力上出现在一起,但这是你应该使用的。


否则,请将它们设置为真正的重载,但使用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)
    {
        ...
    }
  • XML注释中的Summary标记显示在Intellisense中
  • 您可以使用过时的标记来装饰该方法,这也将根据设置生成警告或错误

    [System.Obsolete("use GetPrice(make, model, year)")]
    

  • 好吧,我假设他在源文件中定义了一个类似于[property]的东西来“提示”Intellisense哪个重载优先。我不知道你的一般问题,但这个特定的情况可能可以通过命名来解决,例如,便宜版本的GetPrice和昂贵版本的QueryPrice或FetchPrice(提示它将与数据库对话)。只是一个想法。如果您需要保留昂贵的重载以保持兼容性,请使用EditorRowSableAttribute(EditorRowSableState.Never)标记它对Intellisense隐藏它。我想知道在那里进行三次数据库调用是否明智。当然,您可以编写一个查询,在只访问数据库一次时返回所需的所有数据。@itowlson:Does[EditorRowsableAttribute(EditorRowsableState.Never)]真的为你工作吗?科里:我已经让它跨程序集边界工作。它似乎在项目中不起作用。我想我也记得这一点,但快速测试显示较少的params=first。摘要显示在Intellisense中,但备注不显示(两者都将显示在生成的文档中)另外,#warning(警告)似乎不是一个好的选择,因为它在原始方法中显示为警告,而不是在调用它的地方。Kyralessa,我认为备注标记是Intellisense的一部分,但刚刚测试并确认它们不是。警告的要点很好,过时是实现该路线的方法。感谢您的输入,我编辑了我的答案,[Observe]属性将警告用户,但不会影响Intellisense排序(至少在我的Visual Studio 2012中不会)。
    [System.Obsolete("use GetPrice(make, model, year)")]