c#, Java 现在有哪些初始化一个对象的语法糖的代码写法? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
tctc4869
V2EX    程序员

c#, Java 现在有哪些初始化一个对象的语法糖的代码写法?

  •  1
     
  •   tctc4869 2020-06-27 10:39:24 +08:00 3429 次点击
    这是一个创建于 1963 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想要设计一些小框架,框架主类的内部有一些框架内的对象类型的字段初始化配置,我要使用链式调用的方式来初始化配置类实例的字段。但是我不想在初始化时配置对象字段还必须写这些对象字段的类名。

    java,c#的类实例初始化器要写类型的名称,这是我不喜欢的,现在有什么语法糖能在初始化一个类的实例时,避免初始化该类的内部对象字段暴露这些字段的所属类名?只需要凭借 ide 软件的代码提示功能来"点"出属性名就可以。

    现在我知道有一个方式,就是利用无返回值的委托,可以在初始化内部对象字段时不用暴露类型名称,c#演示代码如下: 假设 Person 是我们要是使用 new 出的小框架使用的主类,stu 是 Person 的一个私有成员,类型是 Student 。Person 类有以下方法

    public Person setStu(Action<Student> o){

     stu=new Student(); o(stu); return this; 

    }

    使用演示 Person p=new Person().setStu((o)=>{o.name="学生名称";o.stuId="123"});

    这是一个链式调用结合函数式编程来配置类的内部对象字段的方式。没有暴露内部成员的类型名。

    除了这个还有其他的初始化语法糖的写法么?如果要初始化配置一个类的字段的字段成员。要怎么弄比较好

    15 条回复    2020-06-27 23:26:37 +08:00
    aguesuka
        1
    aguesuka  
       2020-06-27 12:30:41 +08:00 via Android
    builder 模式,静态工厂,java 的 socket 里还有个 serOption,不知道叫啥模式
    tanranran
        2
    tanranran  
       2020-06-27 14:13:39 +08:00
    1 、目前没有这种语法糖

    2 、建造者模式就可以满足你的需求

    3 、java 、c# 通用
    winnerczwx
        3
    winnerczwx  
       2020-06-27 16:05:03 +08:00
    internal static class Program
    {
    private static void Main(string[] args)
    {
    var person = Person.Create("张三", 123);
    }
    }

    public class Student
    {
    public string Name { get; set; }
    public int StuId { get; set; }
    }

    public class Person
    {
    private Student Student { get; set; }

    private Person(){}

    public static Person Create(string name, int id) => new Person
    {
    Student = new Student
    {
    Name = name,
    StuId = id
    }
    };
    }
    winnerczwx
        4
    winnerczwx  
       2020-06-27 16:08:00 +08:00
    格式有点乱, 上张图吧

    https://s1.ax1x.com/2020/06/27/N612jA.jpg
    jiangzm
        5
    jiangzm  
       2020-06-27 16:34:07 +08:00
    既然是链式你举的例子有问题,应该用 Func 而不是 Action 。

    你无非就是想省掉初始化的类名,在 C# 9.0 已经有'new()'这种语法糖了。

    比如原来这样写:Person p=new Person() { stu = new Student() };
    在 C#9.0 这样写: Person p=new Person() { stu = new () };

    PS: 请注意区分以前的 new{} 匿名对象(动态生成 Class ),和 new() 类型推导语法糖
    tctc4869
        6
    tctc4869  
    OP
       2020-06-27 17:25:43 +08:00 via Android
    @jiangzm 这的确可以,但是,如果但是框架内部不一定是自定义对象,可能是原生对象或集合,这些字段不能暴露给外界。
    charlie21
        7
    charlie21  
       2020-06-27 17:41:38 +08:00 via iPhone
    @winnerczwx 请问你这个 usages 和 exposing API 的提示怎么来的?
    MarkLeeyun
        8
    MarkLeeyun  
       2020-06-27 18:36:35 +08:00
    @winnerczwx 这是 c#吗??
    jiangzm
        9
    jiangzm  
       2020-06-27 18:43:34 +08:00
    @tctc4869 自定义对象和原生对象有啥区别吗?你要不暴露成员就封装起来啊 ,这么简单的道理纠结个啥啊???
    winnerczwx
        10
    winnerczwx  
       2020-06-27 18:45:14 +08:00 via iPhone
    @charlie21 ide 自带的
    winnerczwx
        11
    winnerczwx  
       2020-06-27 18:45:28 +08:00 via iPhone
    forgottencoast
        12
    forgottencoast  
       2020-06-27 20:29:55 +08:00
    楼主可以看看 Asp.Net Core 的初始化部分代码,几乎都是这种形式。
    charlie21
        13
    charlie21  
       2020-06-27 21:34:16 +08:00
    @winnerczwx 请问是啥 IDE / 插件 什么的,VS 2019 吗
    arrow8899
        14
    arrow8899  
       2020-06-27 21:51:50 +08:00
    @charlie21 专业版才有这个功能,社区版没有
    poorcai
        15
    poorcai  
       2020-06-27 23:26:37 +08:00 via iPhone
    @winnerczwx #4 这是什么 ide 啊?另外系统好像不是 windows 的样子
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1240 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:47 PVG 01:47 LAX 09:47 JFK 12:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86