2012-11-14 129 views
10

我最近发现C#中的结构可以有方法。静态结构方法和静态类方法有什么区别?

不小心,我发现自己一直在我的代码中使用空结构的静态方法,而不是我认为正在处理的静态类的静态方法!

例如

public struct Foo 
{ 
    public static void Bar(Param param) 
    { 
     ... 
    } 
} 

它并不真正被用作结构在这一点上,因为它没有属性可言!

这与使用类的静态方法(静态或其他方式)有很大不同吗?是否有任何理由相互优先? (我的直觉告诉我,使用静态结构的方法是,至少,不太直观)

回答

16

没有,静态成员属于而不是类型的实例。声明静态类成员和静态结构成员之间没有区别(无论在性能还是语义上)。

需要注意的是,如果一个类型的唯一函数是包含静态成员,则应该使用静态类。有了结构体,就有一个隐含的,不可改变的公共的,无参数的构造函数。如果该类型没有任何实例方法,则应删除创建实例的能力。声明类static与声明abstract sealed相同,因此开发人员将无法无意中创建无目标的实例。

+3

声明一个'static'类具有额外的好处(通过'abstract sealed'),允许编译器在变量声明或转换中将任何类型的用法标记为错误。 –

+0

@mikez同样,以及将任何实例成员声明标记为错误。 – cdhowie

+3

@mikez我认为一个更重要的区别是'abstract sealed class'简直是无效的C#。 – svick

3

行为没有什么不同。 C#混合结构大大增加了结构和类特征的交集。就个人而言,我只会使用一个类,因为它对我来说似乎更加正确(当然更符合大多数语言中的约定)。

+0

可以定义C++结构的方法和构造函数,所以它不是C#中首次引入的全新功能。 – Jagger

+0

如何设置'[StructLayout(LayoutKind.Explicit)]'的结构?这不能被一个班级取代。 –

相关问题