4

有没有办法将 C# 类分成包含类定义的标头和包含实现的实际 .cs 文件?我想可以通过创建一个界面来做到这一点,但这似乎不对。我只想要一个文件,我可以在其中看到类设计,而不是所有细节。在 C++ 中很容易做到,但我还没有看到用 C# 完成。

提前致谢。

4

16 回答 16

24

这是错误的做法。C# 不是 C++。忘记头文件

如果您想要类摘要,只需在 Visual Studio 中打开对象浏览器。它将为您提供类中所有方法的签名。

于 2008-09-21T20:30:08.467 回答
16

您可以使用部分类和部分方法。我不确定你为什么要这样做...

部分类和方法 - MSDN

于 2008-09-21T20:29:41.700 回答
10

在同一个文件中,您可以使用 Visual Studio 大纲功能来折叠类,以便您只看到方法和属性的名称。

您还可以使用 Visual Studio 查看类视图,它为您提供类的各种方法和属性的名称。

在 dotnet 中几乎没有理由需要在与其实现不同的地方定义一个类。

于 2008-09-21T20:29:00.343 回答
2

不,没有办法(或真正的理由)想要在 C# 中执行此操作。您可以让 VS.NET 为您总结一个类(在视图菜单中全部折叠),或者如果您真的想按照您所说的那样使用接口。你问背后的原因是什么?

于 2008-09-21T20:28:25.413 回答
1

You can use an interface to achieve the same intention.

IFoo.cs:

public interface IFoo
{
  int DoFoo();
}

Foo.cs:

public class Foo : IFoo
{
  public int DoFoo()
  {
    return 1;
  }
}
于 2008-09-21T21:25:45.543 回答
1

我不认为你可以像在 C++ 中那样做头文件。查看类和方法的 partial 关键字。我昨天才了解它们,所以我还没有真正使用它们,但它们可能会帮助你完成你想做的事情。

于 2008-09-21T20:30:17.703 回答
1

如果您对私有方法感兴趣,那么提取接口并不是一个好计划。使用抽象类意味着实质性地改变应用程序的设计(我认为,不必要地增加复杂性)以支持“视图”要求。部分类不会在一个地方向您显示完整的公共和私人签名,因此这也不理想。

因此,如果您没有 IDE,或者不想使用它,我会使用 Reflector 中的默认反汇编操作(免费,而且无论如何都是一个很棒的玩具):

http://www.red-gate.com/products/reflector/index.htm

例如。System.Web.Caching.Cache

public sealed class Cache : IEnumerable
{
    // Fields
    private CacheInternal _cacheInternal;
    public static readonly DateTime NoAbsoluteExpiration;
    public static readonly TimeSpan NoSlidingExpiration;

    // Methods
    static Cache();
    [SecurityPermission(SecurityAction.Demand, Unrestricted=true)]
    public Cache();
    internal Cache(int dummy);
    public object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);
    public object Get(string key);
    internal object Get(string key, CacheGetOptions getOptions);
    public IDictionaryEnumerator GetEnumerator();
    public void Insert(string key, object value);
    public void Insert(string key, object value, CacheDependency dependencies);
    public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration);
    public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);
    public object Remove(string key);
    internal void SetCacheInternal(CacheInternal cacheInternal);
    IEnumerator IEnumerable.GetEnumerator();

    // Properties
    public int Count { get; }
    public long EffectivePercentagePhysicalMemoryLimit { get; }
    public long EffectivePrivateBytesLimit { get; }
    public object this[string key] { get; set; }
}
于 2008-09-22T04:16:46.990 回答
1

这只是 C++ 的一个特性,因为古代编译器需要函数签名的前向声明才能正常工作。

如果这是您觉得很方便的东西,并且您想要不止一次,您可以尝试编写一个小实用程序,使用反射从任何组件中提取公共接口,并将其格式化为您使用的任何布局的文本文件通缉。

另一种选择是使用 /// 语法为类创建 XML 文档。

于 2008-09-22T08:14:10.617 回答
0

如果你真的真的需要这样做,那么最接近的选项是 Refactor --> Extract interface。

于 2008-09-22T02:42:44.407 回答
0

对于所有说“使用 IDE 〜!〜”的人,您没有抓住重点。代码并不总是在 IDE 中读取。也许他想把它打印出来?还是发邮件?这就是不实现语言功能的问题,因为您可以让 IDE 来做:代码并不总是在 IDE 中读取(甚至写入)。

也就是说,您可以使用部分类和方法来做到这一点;但是,我认为您不能在两个文件中都有实例变量。

于 2008-09-22T02:47:31.867 回答
0

这不是IDE的用途吗?

编辑:否则推断和抽象类是要走的路。

于 2008-09-21T20:27:20.957 回答
0

尝试类视图。当您单击每个班级时,您将获得列出的成员。

于 2008-09-21T20:28:59.720 回答
0

当您有一个实例后跟“。”时,IDE 将准确地向您显示该内联。喜欢

myBadlyNamedObject。

(或“ClassName.”),美妙之处在于您在处理对象时触手可及,而不是在您决定打开对象定义以查看它可能是什么时

于 2008-09-21T20:29:48.517 回答
0

据我所知,这是不可能的。但是,您可以通过使用部分类来使事情变得更好,将类的不同部分放在不同的文件中。例如,您可以将所有公共方法放在一个文件中,将所有私有方法放在一个文件中,以便更轻松地了解哪些方法可用于其他对象。

于 2008-09-21T20:31:09.307 回答
0

WinCV 是一个 .net 1.0 框架 sdk 实用程序,它为您提供了一个类似 c++ 的 .net 程序集的标题视图。在 google 上搜索 wincv.exe,了解如何为 .net 2.0 配置它。

于 2009-05-03T17:07:32.763 回答
0

你总是可以使用部分类

于 2010-07-31T11:19:10.017 回答