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)
这导致以下输出:

如您所见,构造函数逻辑运行,然后为属性分配值.我需要这个以相反的方式工作.
这可能吗?
序列化要求您具有无参数构造函数,但不限制您使用该构造函数.
保留no-arg构造函数以进行反序列化,但添加另一个获取值的构造函数,并在需要在代码中实例化类时执行所需的初始化.
对象初始化语法只是构造后设置属性的简写.
不.对象初始化语法只是一种快捷方式.当你写:
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)
如果为了使对象存在而需要参数,则应将它们作为参数放在构造函数中.
| 归档时间: |
|
| 查看次数: |
3165 次 |
| 最近记录: |