我可以使用对象初始化语法在构造函数运行之前为属性赋值吗?

JMK*_*JMK 3 c# constructor initialization

我正在使用对象将对象序列化为XML System.Xml.Serialization,这需要我使用无参数构造函数.

因此,我尝试使用对象初始化语法为某些属性赋值,然后在将对象序列化为XML之前,根据需要使用构造函数逻辑来格式化这些值.

我的问题是构造函数在为属性赋值之前运行.简化示例如下:

class Program
{
    static void Main(string[] args)
    {
        Foo myFoo = new Foo() { HelloWorld = "Beer", HelloWorldAgain = "More beer" };

        Console.WriteLine(myFoo.HelloWorld);
        Console.WriteLine(myFoo.HelloWorldAgain);

        Console.ReadLine();
    }
}

public class Foo : Bar
{
    public string HelloWorld { get; set; }

    public Foo()
    {
        Console.WriteLine("Foo Was Initialized");
        Console.WriteLine(HelloWorld);
    }
}

public abstract class Bar
{
    public string HelloWorldAgain { get; set; }

    public Bar()
    {
        Console.WriteLine("Bar was initialized");
        Console.WriteLine(HelloWorldAgain);
    }
}
Run Code Online (Sandbox Code Playgroud)

这导致以下输出:

产量

如您所见,构造函数逻辑运行,然后为属性分配值.我需要这个以相反的方式工作.

这可能吗?

Jay*_*Jay 6

序列化要求您具有无参数构造函数,但不限制您使用该构造函数.

保留no-arg构造函数以进行反序列化,但添加另一个获取值的构造函数,并在需要在代码中实例化类时执行所需的初始化.

对象初始化语法只是构造后设置属性的简写.


Ree*_*sey 5

不.对象初始化语法只是一种快捷方式.当你写:

Foo foo = new Foo { HelloWorld  = "Beer" };
Run Code Online (Sandbox Code Playgroud)

编译器只是将其重写为非常接近于写入时发生的事情:

Foo foo = new Foo();
foo.HelloWorld  = "Beer";
Run Code Online (Sandbox Code Playgroud)

如果为了使对象存在而需要参数,则应将它们作为参数放在构造函数中.

  • @Reed,迂腐,[它不是*完全相同](http://stackoverflow.com/questions/1679780/when-using-object-initializers-why-does-the-compiler-generate-an-extra -local-va)就像你写的那样. (6认同)