C# 类中的这个构造函数能不能省略?

2023-09-04 13:56:25 +08:00
 d3js
// 像素转换信息
public class ConvertParam
{
  // 输入的图像信息
  public CImage InImage { get; set; }

  // 输出的图像信息
  public CImage OutImage { get; set; }

  // 构造函数
  public ConvertParam()
  {
    InImage = new CImage();
    OutImage = new CImage();
  }
}

大佬们,上面 ConvertParam 类里面有两个 CImage 类型的属性 InImage 和 OutImage ,

下面的无参构造函数能不能省略呢?

如果不能的话,这个无参构造函数起什么必要的作用呢?

952 次点击
所在节点    C#
4 条回复
cat
2023-09-04 14:12:15 +08:00
作用就是,当 new 一个 ConvertParam 对象的时候,
它的 InImage 和 OutImage 属性也同步 new 一个 CImage 对象,
如果省略,这两个属性就是默认值 null
rwecho
2023-09-04 15:35:52 +08:00
这个就是默认构造函数, 它可以省略掉, 前提是你要自己初始化 InImage 和 OutImage

这里有几种写法:

1.

public CImage InImage { get; set; } = new CImage(); // 直接初始化属性的时候,赋值。


2.
public CImage InImage { get; init; } = null!; // 定义一个不能为空的属性 InImage , 并且声明它必须在初始化的时候进行赋值, 如下

var convertParam = new ConvertParam()
{
InImage = new CImage ()
}

3. 定义成 record ,如果是简单的类,用 record 最方便,特别是对一些序列化的类:

public record ConvertParam(CImage InImage, CImage OutImage);
yuandong
2023-09-07 11:40:11 +08:00
就是字段初始值为 null 还是 CImage 空对象的区别
d3js
2023-09-07 13:20:05 +08:00
@yuandong 结合上面大佬的回答。老哥的综合通透!👍

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/970756

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX