在C#中,将所有单独引用的类重写为struct是一种相当重要的方法吗?
我有一个班有很多成员在C#中,将所有单独引用的类重写为struct是一种相当重要的方法吗?,c#,.net,C#,.net,我有一个班有很多成员 public class MyClass{ public int ModuleA_Value00; public int ModuleA_Value01; public void ModuleAMethod0(){} public int ModuleB_Value00; public int ModuleB_Value01; public int ModuleC_Value00; public int ModuleC
public class MyClass{
public int ModuleA_Value00;
public int ModuleA_Value01;
public void ModuleAMethod0(){}
public int ModuleB_Value00;
public int ModuleB_Value01;
public int ModuleC_Value00;
public int ModuleC_Value01;
//Just illustration, in fact there should be much more.
}
为了使代码更具可读性,我将类成员分解为几个较小的类,而不关心其他类型如何工作
public class MyClass{
public ModuleA ModuleA;
public ModuleB ModuleB;
public ModuleC ModuleC;
}
public class ModuleA{
public int Value00;
public int Value01;
public void Method0(){};
}
public class ModuleB{
public int Value00;
public int Value01;
}
public class ModuleC{
public int Value00;
public int Value01;
}
然后我开始怀疑将ModuleA
、ModuleB
和ModuleC
从类更改为结构。这严重违反了以下规定:
与所有事情一样,在需要之前或除非需要,不要进行优化,尤其是不要进行微优化。选择结构而不是类绝对是一个微观优化。这不是一个好主意,相反,您可以使用c#中的
部分类的概念。这将允许您维护单个类,但隔离在不同的文件中,并且易于阅读
分部类与对象继承无关。分部类只是将定义类的源代码拆分为单独文件的一种方法
您可以在不同的文件中创建这些类:
e、 g。
MyClass.cs
public partial class MyClass{
public int ModuleA_Value00;
public int ModuleA_Value01;
}
MyClass1.cs
public partial class MyClass{
public void ModuleAMethod0(){}
public int ModuleB_Value00;
}
MyClass2.cs
public partial class MyClass{
public int ModuleB_Value01;
public int ModuleC_Value00;
public int ModuleC_Value01;
}
在应用程序中开发分部类时,您应该注意以下几点。
- 您需要在分部类的每个部分中使用分部关键字
- 分部类的每个部分的名称应该相同,但分部类的每个部分的源文件名可以不同
- 分部类的所有部分都应位于同一命名空间中
- 分部类的每个部分都应该在同一个程序集或DLL中,换句话说,您不能在不同类库项目的源文件中创建分部类
- 分部类的每个部分都具有相同的可访问性
- 如果在分部类上继承类或接口,则该类或接口将在分部类的所有部分上继承
- 如果部分类的一部分被密封,那么整个类将被密封
- 如果部分类的一部分是抽象的,那么整个类将是一个抽象类
似乎您想要的是记录而不是结构(如果有人更新代码而没有意识到这些是可变结构,则结构的使用时复制效果意味着您将使将来的维护更加困难)。请注意,类成员必须是字段,而不是属性,否则,您将无法设置任何结构的成员。关于性能,我的第一个问题是:您的性能有问题吗?在没有问题的情况下不要提前过度优化。@Richard记录实际上是类,因此“…可以通过较少的GC工作来提高性能”不会有太大的好处。如果您希望将类更改为可变结构的唯一原因是为了节省GC,那么将其保留为类通常是一个更安全的选择。通常,在GC成为您的瓶颈之前,您有很多机会来提高性能。有时GC甚至更快,尤其是当应用程序处于空闲状态时,它可能会延迟运行。