【问题标题】:C#: How to initialize an object and all it's attributesC#:如何初始化一个对象及其所有属性
【发布时间】:2021-03-11 11:46:25
【问题描述】:

在C#中有什么方法可以初始化一个对象而不需要初始化他的属性来使用它们?

我发现自己将 json 对象映射到类中,我想知道这样做是否效率低下:

Class1 object1 = new Class1 ();
object1 .Name = new Class2 ();
object1 .Name.Content = "name";

我不想为了代码清晰而使用初始化程序来避免类似:

Class1 obj1 = new Class1 ()
{
    Name = new Class2()
    {
        Content = "name"
    }              
 };

这看起来不错,但是我必须使用的模型通常很大并且有很多层,如果我使用初始化器,最终会变成一个无法读取的集群。

我无法更改收到的模型,因此简化模型也不是一种选择。

我有什么办法可以做这样的事情:

Class1 object1 = new Class1 ();
object1.Name.Content = "name";

那会自动隐式实现Name = new Class2()

允许我避免 Name is not initialized 异常。我知道我可以做自己的构造函数并在其中初始化它的属性,但是已经完成了很多代码,并且不再可行。

如果不可能,我对任何可以帮助我减少一些代码初始化属性的替代方法感兴趣。

【问题讨论】:

  • 你的 json 库不处理这个吗?
  • Name = new Class2() - 你可以在Class1的构造函数中做到这一点。

标签: c# oop


【解决方案1】:

你不能隐式实例化一个属性,不。它必须在某处实例化。

可以做什么,以启用您想要的语法,是在Class1 构造函数或属性声明中实例化它。例如:

public class Class1
{
  public Class2 Name { get; set; } = new Class2();
}

演示:https://dotnetfiddle.net/ZySMLX

public class Class1
{
  public Class2 Name { get; set; }

  public Class1()
  {
    this.Name = new Class2();
  }
}

演示:https://dotnetfiddle.net/Sbd2wP

但显然这有其自身的副作用 - 我不知道您是否想强制以这种方式始终实例化它,或者您的应用程序中是否存在这样的场景'不可取。


附:你说出现这种情况是因为你是

将 json 对象映射到类中

...但这当然应该由自动序列化库来完成,而不是用文字写出所有这些实例化。目前尚不清楚确切的情况是什么。我已经直接回答了你的问题,但我可能会质疑这是否真的是解决你的整体问题的最佳方法。

【讨论】:

  • 感谢您的回答。我不使用自动序列化库,因为我得到了一个网页 JSON 的示例,并且我必须使用要在页面上显示的对应数据生成该 JSON。这个 JSON 来自一个不同的项目,老实说,我从来没有想过将这个 JSON 导入我的项目并使用它来生成类的可能性,我将来可能会尝试这样做。有时我可能不希望初始化整个对象,我希望可能有一种不同的方式来调用构造函数或类似的方法来这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多