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

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

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

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

    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   ·   实用小工具   ·   3046 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 13:37 · PVG 21:37 · LAX 05:37 · JFK 08:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.