例如我有一个类class Test

}类里用到了一个事件,需要一个委托,但这个委托定义在类的内部还是外部?如果用到了枚举,这个枚举是定义在类的外部还是内部?同样,如果用到了事件参数,如
class MyEventArgs:EventArgs
{
}
这个类定义在Test的内部还是外部?以前我都是定义在类的外部,特别是MyEventArgs这样的类,很少见过在一个类的内部定义另外一个类,但后来注意到framework 程序设计书中,写成以下形式:
class Test

    class MyEventArgs:EventArgs
    {
    }
}将MyEventArgs定义在了Test类的内部,实在是不能理解,所以发个帖子问问大家的看法。主要就是委托、枚举、事件参数类是定义在主类的内部还是外部?

解决方案 »

  1.   

    把一个类定义到另外一个类的内部通常叫做内联类,对于什么时候使用这样的类其实有一定的场合,当一个类仅仅是为某一个特定的类服务(如你上边的参数类),对于别的类绝对不可能使用到他的时候,最好把这样的类定义为内联类,因为他对于外界是完全可以隐藏的,而对于使用他的类却是透明的,这也符合OOP的封装的思想。
      

  2.   

    哦,那我上面提到的事件参数这样的类,如果只用于某一特定类的事件中,就应该定义在那个类的内部,是吗?那么,枚举和委托又应该怎么做呢?好像framework自己的类库,枚举定义在类的内部和外部都有的吧。
      

  3.   

    都一样,要看你对类的访问性的要求了,private类中定义的public类是不能被外部类所访问的
      

  4.   

    .net允许类内部再定义子类,这一点来说与纯OO理论是不相符的。不过问题也不大,似乎仅仅是命名的差异。对路径限定更多的命名方式,似乎可以避免命名冲突,例如在不同地方分别由两个完全不同意思的类型但是都叫做MyEventArgs,这时候可以把它们限定在较小的范围内。class Test

        class MyEventArgs:EventArgs
        {
        }
    }还是internal class MyEventArgs:EventArgs
     {
     }class Test

    }似乎都差不多。关键是设计复杂系统的时候正确区分project/命名空间,大的方面抓好了,小得方面可以放手。
      

  5.   

    当然限制类内连类型,写的时候就要累赘一点。往往在delegate声明的时候把它放在类内,纯粹是为了故意要累赘一点,好让使用这个委托类型的代码也有点“文档”的感觉,而并不是为了将其访问权限局限起来。