【发布时间】:2012-04-22 20:48:55
【问题描述】:
使用 Visual Studio 2010(也可能是 2008 年)我注意到 Intellisense 会建议枚举的完全限定命名空间的行为。
例如,我可以这样写代码:
element.HorizontalAlignment = HorizontalAlignment.Right;
element.VerticalAlignment = VerticalAlignment.Bottom;
但是当我尝试写它时,它建议我这样写:
element.HorizontalAlignment = System.Windows.HorizontalAlignment.Right;
element.VerticalAlignment = System.Windows.VerticalAlignment.Bottom;
这些不必要的额外代码确实会加起来并使其可读性降低,我基本上必须与 Intellisense 作斗争才能避免它。
这是我的理由吗?我可以把它关掉吗?我认为原因是枚举的名称与属性的名称相同。但这真的不是一个很好的理由。
编辑:
这是另一个示例,说明为什么不需要完全限定的命名。
using SomeOtherNamespace;
namespace SomeNamespace
{
public class Class1
{
public Class2 Class2 { get; set; }
public Class1()
{
// These all compile fine and none require fully qualified naming. The usage is context specific.
// Intellisense lists static and instance members and you choose what you wanted from the list.
Class2 = Class2.Default;
Class2.Name = "Name";
Class2.Name = Class2.Default.Name;
Class2 = Class2;
}
}
}
namespace SomeOtherNamespace
{
public class Class2
{
public static Class2 Default { get; set; }
// public static Class2 Class2; (This throws an error as it would create ambiguity and require fully qualified names.)
// public static string Name { get; set; } (This also throws an error because it would create ambiguity and require fully qualified names.
public string Name { get; set; }
}
}
【问题讨论】:
-
引人入胜;据我回忆,VS 从来没有在不需要时建议完全限定的名称。
-
我之前在 Windows 窗体应用程序中遇到过同样的问题。它建议我编写 System.Windows.Forms.DialogResult.OK 而不仅仅是 DialogResult.OK。同样,我很确定在该范围(表单)中有一个名为“DialogResult”的本地属性。
-
正确。在这种情况下,我认为这是必需的。
-
由于上下文关系,它不是必需的,原因与您可以创建一个名为“public Image Image”的属性相同。编写“DialogResult = DialogResult.OK”可以很好地编译,因为没有歧义。不必将其写为“DialogResult = System.Windows.Forms.DialogResult.OK”。
-
对 Intellisense 而言,它在 那一刻 所关心(知道)的只是 DialogResult,而那在那个时候将是模棱两可的。只有当您添加更多内容时,它才会变得不同。
标签: c# visual-studio intellisense