C#类函数成员声明&履行

时间:2009-10-10 18:41:07

标签: c# class-design declaration definition

C#中的类定义和实现是否有类似于C ++中的概念?

我更喜欢通过删除大多数(如果不是每个)实现细节来保持我的类定义简单(这取决于您可能知道的几个因素,但通常我会将大多数成员实现细节留在类定义之外)。这样可以让我对鸟类及其功能进行鸟瞰。

然而在C#中,似乎我被迫在声明时定义我的成员函数。这可以避免,还是以某种方式规避?

在我学习C#期间,这是困扰我的一个方面。课程,特别是复杂课程,越来越难以阅读。

12 个答案:

答案 0 :(得分:7)

如果您使用的是Visual Studio,则可以利用类视图。您还可以使用源代码编辑器的展开/折叠功能。

在不可能的情况下,您的工具无法提供帮助,您可以随时编写一个快速实用程序,为您总结课程。

如果已编译该类,您也可以使用Reflector查看该类。

答案 1 :(得分:7)

不,你在C / C ++中找不到C#中的实现和头文件的概念。您最接近的是使用界面,但界面只能定义您的类的公共成员。然后,您将最终得到类和接口的1对1映射,这实际上并不是接口的使用方式。

答案 2 :(得分:7)

这确实是一个需要退一步看大局的情况。 Visual Studio有许多工具可以帮助您编写和操作代码,包括概述,#region,类视图,类图,代码定义窗口等等。

C#不是C ++,如果你试着这样做,那么你就会绊倒自己,没有其他人可以阅读你的代码。

学习使用Visual Studio工具的一天将在生产力方面多次回报投资,您很快就会想到如何使用C ++的做事方式。

响应评论更新

我早就停止将我的代码视为简单的文本文件了。我认为代码是一种有机的东西,我发现允许自己依赖功能丰富的IDE可以让我更容易地上下移动抽象层次,并且不断提高我的工作效率。我想这可能是个人特质,也许并不适合所有人;我有一个非常'视觉'的头脑,当我能看到图片中的东西时,我工作得最好。

也就是说,一个聪明的IDE不是穷人风格的借口。编写“干净代码”的最佳实践不需要智能IDE。清洁代码的原则之一是保持对其使用的定义,我认为可以扩展到包含声明和定义。就个人而言,我认为将声明和定义分开会使代码不那么清晰。如果你发现你得到了难以理解的怪物课程,那么这可能表明你违反了单一责任原则。

在c / C ++中单独定义和声明的原因是因为C ++使用单通道编译器,其中前向引用无法在以后解析,这与C#及其two-pass compiler不同,它可以愉快地找到引用而不管顺序如何宣言。这种差异源于编译器的不同设计哲学:C / C ++认为每个源文件都是编译单元,而在C#中,整个项目被认为是编译单元。我想当你习惯于以C / C ++方式工作时,将声明和定义分开似乎是一种理想的风格元素,但我个人认为保持声明和使用(或者在这种情况下声明和定义)会增强,而不是降低,可读性。我曾经是一名C程序员,直到2001年我开始使用C#。我一直很喜欢C,并认为做事的方式是'蜜蜂膝盖'。这些天,当我阅读C / C ++代码时,我认为它看起来非常可怕,我无法相信我们过去常常忍受这种方式。我想,这都是你习惯的问题。

答案 3 :(得分:4)

在C#中,您可以使用部分类和部分成员来伪装它,但是,前向声明和原型与您的新语言一起使用渡渡鸟。 Class View,Class Diagrams,Intellisense等都有助于消除对这些“特征”的潜在需求。

答案 4 :(得分:3)

定义界面。

然后很高兴能够使用一个很好的代码辅助工具自动实现接口。

答案 5 :(得分:3)

您可以通过为每个类定义一个接口来获得类似的结果。

答案 6 :(得分:3)

听起来你指的是interfaces。在c#中,您可以在接口中定义所有成员函数,然后在另一个类中实现它们。

答案 7 :(得分:1)

如果您发现某个课程难以阅读或难以理解,那通常表明该课程正在尝试做太多。不要试图复制C ++的声明和定义分离,而是考虑将麻烦的类重构为几个类,这样每个类的责任都会减少。

答案 8 :(得分:1)

只要有可能或需要,我将使用之前的响应并定义接口。但它并不总是合适的。

或者,您可以通过使用一些静态代码检查工具来解决这个“问题”。 Resharper的“文件结构”窗口将为您提供您想要的内容。您还可以使用visual studio中内置的“Class View”。但我更喜欢前者。

答案 9 :(得分:0)

我猜你所指的原型在C#中并不存在。像其他人所建议的那样定义接口会给你一个关于收集方法声明的点,但它与原型不同,我不太确定它会帮助你使你的实现类更容易阅读。 / p>

C#不是C ++,不应该被视为C ++。

答案 10 :(得分:0)

有两种方法可以使它更加符合C ++ - ish:

  • 创建一个声明所有方法签名和属性的接口文件
  • 使用类定义上的partial修饰符在多个文件中的类中实现该接口

编辑:

// File: ICppLikeInterface.cs
public interface ICppLikeInterface
{
    ...
}

// File: CppLikeImplementation1.cs    
public partial class CppLikeImplementation : ICppLikeInterface
{
    ...
}

// File: CppLikeImplementation2.cs    
public partial class CppLikeImplementation : ICppLikeInterface
{
    ...
}

将接口分离到头文件的C ++方式主要是(我认为),因为在创建C以允许在“过去”期间进行快速,增量编译时,由于早期的设计决策,因为编译器抛弃了任何元数据,与Smalltalk相反。这不是C#(也不是Java)的问题,在最近的硬件上数万行可以在几秒钟内编译(C ++仍然没有)

答案 11 :(得分:0)

不确定您的课程意味着什么继续增长并且难以阅读。你的意思是你想要一个头文件,如类的成员的视图?如果是这样,就像John建议的那样,你不能只是崩溃实现,所以你不必看到它吗?

如果你不希望每个类都实现某个东西,那么接口可能就好了(就像别人说的那样)。

但是,作为一个方面的想法,如果你的课程本身在你编写程序时变得越来越复杂,那么它可能更像是设计问题而不是语言问题?我认为课程应该有一个责任,而不是随着课程的增长而承担越来越多的责任,而是在继续开发软件时,课程的数量和使用的课程应该增长并变得更加复杂?