C#:表示方法的可执行方式是作为接口的一部分

时间:2010-01-29 18:19:17

标签: c# interface annotations language-features

在C#中是否有办法将方法标记为类的一部分以满足该类实现的接口?我发现自己有时想在挖掘类的代码时为什么会有一些方法,但是当我尝试删除一个因为它没有被使用时,我认为为了让类实现一些接口是必要的。将这些方法标记为这样是很好的。可能像Java中的@Override annotation那样。

编辑:我更愿意显式实现接口,因为在我的类的实例上访问接口方法变得更加麻烦(即,不得不在调用MyClass之前将IMyInterface的实例强制转换为MyInterfaceMethod

编辑:我也不想使用区域。我不希望通过一些任意名称松散地描述一大块代码作为接口实现的一部分,而是表示特定方法,无论它们在类中的哪个位置,都是接口的一部分。甚至一些XML评论模板用于说明该方法所属的接口也不错。

编辑:所有答案似乎都建议我明确实现接口,我不想做,或者我使用区域,我也不想这样做。我认为Will最了解我的要求。我希望有类似注释的东西,所以我可以做类似以下的事情:

[Interface(IMyInterface)]
public void MyImplicitlyImplementedInterfaceMethod() { }

或者,正如this answer的评论中提到的dss539:

public implement void MyImplicitlyImplementedInterfaceMethod() { }

就像我们今天overridepublic override bool Equals(object obj) { }

9 个答案:

答案 0 :(得分:5)

用Visual Studio为你做的#region MyInterface Members围绕它们。

如果仅对接口成员使用#region,则会降低可读性。另一方面,如果将它用于私有变量,属性,方法,事件和不同的接口成员,代码将变得更具可读性。您还可以按功能对成员进行分组。

还有一个选择是使用为您完成此操作的工具。例如,您可以使用NArrange - .NET Code Organizer/Formatter/Beautifier

答案 1 :(得分:4)

您有三种选择:

明确实施界面:

您可以explicitly implement the interface使用语法IInterface.MethodName,例如:

bool IInterface.MethodName(string other) 
{
    // code
}

在区域中包装界面成员

如果您选择通过UI“实现界面”,工具将已将您​​的代码包装在一个区域中:

#region IInterface members

public bool MethodName(string other)
{
    // code
}

#endregion

通过评论记录

C#允许您通过///*XML documentation comments添加多种评论。自由使用!

答案 2 :(得分:2)

如果您的类正在实现您认为应该删除的方法,那么您可能会遇到更深层次的设计问题。

无论如何,Resharper可以帮助你。

http://www.jetbrains.com/resharper/documentation/presentation/overview/code_generation/Generate_demo.htm

将滑块拖动到10/69以查看特殊的“Implements interface”图标。

Resharper告诉您哪个接口需要该方法。

编辑:此外,如果将鼠标悬停在方法名称上,它会弹出文本,说明方法的来源。我不确定这是否是Visual Studio或Resharper的一部分,因为我已经使用了Resharper这么久。 没有安装Resharper的人可以证实这一点吗?

答案 3 :(得分:1)

VB.NET支持这样的东西,但不支持C#。

答案 4 :(得分:1)

也许你想推出自己的自定义属性? - http://msdn.microsoft.com/en-us/library/sw480ze8(VS.80).aspx

  

您可以创建自己的自定义   属性通过定义属性   class,直接派生的类   或间接来自属性,哪个   制作识别属性   元数据中的定义快速而简单。   假设您要标记类和   结构的名称   编写课程的程序员或   结构。您可以定义自定义   作者属性类:

以上描述的例子。您可能希望将其应用于方法,并与Java中的@Override类似。

[Author("H. Ackerman", version = 1.1)]
class SampleClass
{
    // H. Ackerman's code goes here...
}

答案 5 :(得分:1)

您可以使用Visual Studio的插件吗?这将使您无法以无法验证的方式标记代码,但是在查看Visual Studio外部的代码时,您将无法获得信息。

ReSharper在边距中添加了一个图标来表示这一点。将鼠标悬停在它上面,它会告诉您该方法来自哪个界面。单击它,它会将您带到界面。

ReSharper http://img686.imageshack.us/img686/5325/34804250.jpg

我会说CodeRush可能会做类似的事情。

答案 6 :(得分:0)

您可以显式实现该接口,但除非您首先将该类转换为该接口,否则该方法将无法在该类的实例上使用。

public Foo : IDisposable
{
    void IDisposable.Dispose()
    {
    }
}

答案 7 :(得分:0)

#region ISomeInterface implementation
public void Foo(){}
public void Bar(){}
#endregion

答案 8 :(得分:0)

另一种方法,如果您的反区域将使用如此文档注释:

///<summary>
/// Used for implementation of InterfaceX
///</summary>
public void Foo() {}