将C#类分隔为标头和.cs文件
有没有一种方法可以将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配置它。
你总是可以使用局部类