C# 初始设置的类声明在内部是否与在构造函数中设置它们相同?

C# 初始设置的类声明在内部是否与在构造函数中设置它们相同?,c#,C#,初始设置的类声明在内部是否与在构造函数中设置它们相同 例如: class test { int test1 = 5; } 那和我的有什么区别吗 class test { int test1; public test() { test1 = 5; } } 如果没有区别,哪一个更正确 在你的情况下,这是一回事。但是,如果存在参数化构造函数,并且test1是从构造函数传递的值分配的,该怎么办呢 class test {

初始设置的类声明在内部是否与在构造函数中设置它们相同

例如:

class test
{
     int test1 = 5;
}
那和我的有什么区别吗

class test
{
     int test1;
     public test()
     {
         test1 = 5;
     }
}  

如果没有区别,哪一个更正确

在你的情况下,这是一回事。但是,如果存在参数化构造函数,并且test1是从构造函数传递的值分配的,该怎么办呢

class test
{
    int test1;
    public test()
    {
        test1 = 5;
    }

    public test(int ctest)
    {
        test1 = ctest;
    }
}
如果没有区别,哪一个更正确


由开发人员选择他想要哪一个。

在您的情况下,这是同一件事。但是,如果存在参数化构造函数,并且test1是从构造函数传递的值分配的,该怎么办呢

class test
{
    int test1;
    public test()
    {
        test1 = 5;
    }

    public test(int ctest)
    {
        test1 = ctest;
    }
}
如果没有区别,哪一个更正确


开发人员可以选择他想要的。

< P>对于大多数目的,您可以考虑两个成员初始化函数的等效样式。 但是,您应该记住,在成员声明中进行的赋值是在任何构造函数执行之前执行的。正如Jon Skeet在评论中指出的那样,如果从基本构造函数调用虚拟方法,这种时间上的差异可能会产生可观察的工件

class test
{
    int test1;
    public test()
    {
        test1 = 5;
    }

    public test(int ctest)
    {
        test1 = ctest;
    }
}
正确与否是意见的问题。对于简单的整数值,初始值赋值似乎是无害的,但是当您进入更复杂的类型,如日期或其他满负荷对象时,混乱因素开始上升


对于我自己,我通常更喜欢将初始化看作是构造函数的主体中的显式赋值语句,而不是在声明中分散在类中。

< P>对于大多数目的,可以考虑成员初始化的两种样式在功能上是等价的。p> 但是,您应该记住,在成员声明中进行的赋值是在任何构造函数执行之前执行的。正如Jon Skeet在评论中指出的那样,如果从基本构造函数调用虚拟方法,这种时间上的差异可能会产生可观察的工件

class test
{
    int test1;
    public test()
    {
        test1 = 5;
    }

    public test(int ctest)
    {
        test1 = ctest;
    }
}
正确与否是意见的问题。对于简单的整数值,初始值赋值似乎是无害的,但是当您进入更复杂的类型,如日期或其他满负荷对象时,混乱因素开始上升

就我自己而言,我通常更喜欢在构造函数体中将初始化作为显式赋值语句执行,而不是分散在声明中的类中。

这一个称为:

它是如何工作的

类的实例字段变量初始值设定项对应于一系列赋值,这些赋值在进入该类的任何一个实例构造函数第10.10.1节时立即执行。变量初始值设定项按照它们在类声明中出现的文本顺序执行

因此,在您的例子中,字段初始化的这两种变体在功能上是相同的

另外,我想建议您看看这个问题:。

这个问题叫做:

它是如何工作的

类的实例字段变量初始值设定项对应于一系列赋值,这些赋值在进入该类的任何一个实例构造函数第10.10.1节时立即执行。变量初始值设定项按照它们在类声明中出现的文本顺序执行

因此,在您的例子中,字段初始化的这两种变体在功能上是相同的


另外,我想建议您看看这个问题:。

当查看IL代码差异时,您可以看到,在案例1中,变量测试是在调用构造函数之前分配的,而在案例2中,变量测试是在调用构造函数之后分配的

案例1

案例2


当查看IL代码差异时,您可以看到在案例1中,变量test是在调用构造函数之前分配的,而在案例2中,变量test是在调用构造函数之后分配的

案例1

案例2


在您给出的特定情况下,没有功能差异。然而,当涉及继承时,字段初始值设定项的行为可能会令人惊讶。字段初始值设定项实际上是在构造函数之前调用的,虽然构造函数是从派生最少的调用到派生最多的,但字段初始值设定项是从派生最多的调用到派生最少的。因此,如果类A从B派生。当创建A的实例时,将执行以下顺序:A的字段初始值设定项、B的字段初始值设定项、System.Object构造函数、B的构造函数、A的构造函数

以上仅适用于实例字段初始值设定项/构造函数。对于静态字段初始值设定项/构造函数,行为完全不同


至于哪一个在您的案例中是正确的,没有达成一致的约定,但读者通常会欣赏一致性。

在您给出的具体案例中,没有功能上的差异。然而,当她 一旦涉及到这一点,字段初始值设定项的行为可能会令人惊讶。字段初始值设定项实际上是在构造函数之前调用的,虽然构造函数是从派生最少的调用到派生最多的,但字段初始值设定项是从派生最多的调用到派生最少的。因此,如果类A从B派生。当创建A的实例时,将执行以下顺序:A的字段初始值设定项、B的字段初始值设定项、System.Object构造函数、B的构造函数、A的构造函数

以上仅适用于实例字段初始值设定项/构造函数。对于静态字段初始值设定项/构造函数,行为完全不同


关于你的情况哪一个是正确的,没有商定的惯例,但一致性通常受到读者的赞赏。

您还可以注意到,在调试时:-您还可以注意到,在调试时:-通常,它们在功能上并不等价-在成员声明中所做的赋值也在基类构造函数之前执行。如果您的基类构造函数调用派生类中重写的某个虚拟方法,它将不会看到构造函数体中的任何初始化,但变量初始值设定项将被执行。好的一点是,您忘记了通过构造函数中的虚拟调用观察时间差的能力。文本更新。一般来说,它们在功能上并不等价——成员声明中的赋值也在基类构造函数之前执行。如果您的基类构造函数调用派生类中重写的某个虚拟方法,它将不会看到构造函数体中的任何初始化,但变量初始值设定项将被执行。好的一点是,您忘记了通过构造函数中的虚拟调用观察时间差的能力。文本更新。