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

2020-06-27 10:39:24 +08:00
 tctc4869

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

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"});

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

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

3045 次点击
所在节点    程序员
15 条回复
aguesuka
2020-06-27 12:30:41 +08:00
builder 模式,静态工厂,java 的 socket 里还有个 serOption,不知道叫啥模式
tanranran
2020-06-27 14:13:39 +08:00
1 、目前没有这种语法糖

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

3 、java 、c# 通用
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
2020-06-27 16:08:00 +08:00
格式有点乱, 上张图吧

https://s1.ax1x.com/2020/06/27/N612jA.jpg
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
2020-06-27 17:25:43 +08:00
@jiangzm 这的确可以,但是,如果但是框架内部不一定是自定义对象,可能是原生对象或集合,这些字段不能暴露给外界。
charlie21
2020-06-27 17:41:38 +08:00
@winnerczwx 请问你这个 usages 和 exposing API 的提示怎么来的?
MarkLeeyun
2020-06-27 18:36:35 +08:00
@winnerczwx 这是 c#吗??
jiangzm
2020-06-27 18:43:34 +08:00
@tctc4869 自定义对象和原生对象有啥区别吗?你要不暴露成员就封装起来啊 ,这么简单的道理纠结个啥啊???
winnerczwx
2020-06-27 18:45:14 +08:00
@charlie21 ide 自带的
winnerczwx
2020-06-27 18:45:28 +08:00
forgottencoast
2020-06-27 20:29:55 +08:00
楼主可以看看 Asp.Net Core 的初始化部分代码,几乎都是这种形式。
charlie21
2020-06-27 21:34:16 +08:00
@winnerczwx 请问是啥 IDE / 插件 什么的,VS 2019 吗
arrow8899
2020-06-27 21:51:50 +08:00
@charlie21 专业版才有这个功能,社区版没有
poorcai
2020-06-27 23:26:37 +08:00
@winnerczwx #4 这是什么 ide 啊?另外系统好像不是 windows 的样子

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

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

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

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

© 2021 V2EX