V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
d3js
V2EX  ›  C#

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

  •  1
     
  •   d3js · 2023-09-04 13:56:25 +08:00 · 1001 次点击
    这是一个创建于 483 天前的主题,其中的信息可能已经有所发展或是发生改变。
    // 像素转换信息
    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 ,

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

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

    cat
        1
    cat  
       2023-09-04 14:12:15 +08:00   ❤️ 1
    作用就是,当 new 一个 ConvertParam 对象的时候,
    它的 InImage 和 OutImage 属性也同步 new 一个 CImage 对象,
    如果省略,这两个属性就是默认值 null
    rwecho
        2
    rwecho  
       2023-09-04 15:35:52 +08:00   ❤️ 2
    这个就是默认构造函数, 它可以省略掉, 前提是你要自己初始化 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
        3
    yuandong  
       2023-09-07 11:40:11 +08:00   ❤️ 1
    就是字段初始值为 null 还是 CImage 空对象的区别
    d3js
        4
    d3js  
    OP
       2023-09-07 13:20:05 +08:00
    @yuandong 结合上面大佬的回答。老哥的综合通透!👍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1095 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 19:08 · PVG 03:08 · LAX 11:08 · JFK 14:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.