将C#类分隔为标头和.cs文件

时间:2020-03-06 14:30:53  来源:igfitidea点击:

有没有一种方法可以将Cclass分为包含类定义的头文件和包含实现的实际.cs文件?我想可以通过创建一个接口来做到这一点,但这似乎并不正确。我只想要一个文件,在这里我可以看到类的设计,而不是所有的细节。在C ++中做起来很容易,但是我还没有看到用C#完成它。

提前致谢。

解决方案

这不是IDE的目的吗?

编辑:否则,接口和抽象类就是要走的路。

没有没有(或者真正的原因)想要在C#中做到这一点。我们可以让VS.NET为我们总结一个类(在视图菜单中折叠全部),或者如果我们确实想要像我们所说的那样,可以使用一个界面。你问背后的原因是什么?

尝试使用"班级视图"。当我们单击每个班级时,我们将得到列出的成员。

在同一文件中,可以使用Visual Studio大纲函数折叠类,以便仅看到方法和属性的名称。

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

在dotnet中,几乎没有理由需要在与实现不同的位置定义类。

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

局部类和方法MSDN

当我们有一个实例后跟"。"时,IDE会准确地向我们显示该内联。喜欢

myBadlyNamedObject。

(或者" ClassName"。)的好处是,在使用对象时,我们只需动动手指即可,而不是决定打开对象定义以查看其含义时,

那是错误的方法。不用C ++。忘记头文件。

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

我认为我们无法像在C ++中那样执行头文件。
为类和方法签出partial关键字。我昨天才刚刚了解它们,所以我并没有真正使用它们,但是它们可能会完成我们想做的事情。

据我所知这是不可能的。但是,我们可以通过使用部分类将部分内容放入不同文件中,从而使事情变得更好。例如,我们可以将所有公共方法放在一个文件中,而将所有私有方法放在一个文件中,以便更轻松地概述可以从其他对象使用的方法。

我们可以使用"接口"来达到相同的目的。

IFoo.cs:

public interface IFoo
{
  int DoFoo();
}

Foo.cs:

public class Foo : IFoo
{
  public int DoFoo()
  {
    return 1;
  }
}

如果我们确实需要执行此操作,则最接近的选项是
重构->提取接口。

对于所有说"使用IDE〜!~~"的人来说,我们都没把握重点。在IDE中并不总是读取代码。也许他希望将其打印出来?或者通过电子邮件发送?那就是不实现语言功能的问题,因为我们可以让IDE来执行它:代码并不总是在IDE中读取(甚至编写)。

也就是说,我们可以使用部分类和方法来实现;但是,我认为我们不能在两个文件中都包含实例变量。

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

因此,如果我们没有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; }
}

这只是C ++的功能,因为古老的编译器需要对函数签名进行前向声明才能正常工作。

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

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

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

你总是可以使用局部类