在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
从类更改为结构。这严重违反了以下规定:

  • 结构不应该是可变的
  • 结构应该尽可能小
  • 但我认为这是可以接受的,原因如下:

  • 对于它们中的每一个来说,这些实例只会被单个对象引用,因此不必是引用类型,而值类型可以通过较少的GC工作来提高性能
  • 他们不需要被继承
  • 它们不太可能被装箱
  • 我的想法有意义吗

    我的想法有意义吗

    没有

    在类上使用结构没有任何好处,也有许多缺点,除非您绝对需要结构的特性。只有当您要分配数千种这样的类型时,性能才是一个问题


    与所有事情一样,在需要之前或除非需要,不要进行优化,尤其是不要进行微优化。选择结构而不是类绝对是一个微观优化。

    这不是一个好主意,相反,您可以使用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甚至更快,尤其是当应用程序处于空闲状态时,它可能会延迟运行。