gpt4 book ai didi

c# - 在类属性的 'value' 自动属性中设置 'set' 上的属性

转载 作者:太空宇宙 更新时间:2023-11-03 12:33:19 25 4
gpt4 key购买 nike

我有两个类需要相互了解。

在我的示例中,我使用的是带房间的房子。

House 需要了解 Rooms,Rooms 也需要了解 House。

我目前有一个设置,我在我的映射中做类似的事情:

var house = new House();
var room = new Room(house);
house.Rooms.Add(room);

通过这样做,我将房子与房间以及房间与房子联系起来。

我想知道,执行以下操作是否是不好的做法?

private House house;
public House House
{
get
{
return house;
}
set
{
house = value;
value.Rooms.Add(this);
}
}

这样,无论何时创建一个房间,它都会自动添加到房子的房间列表中。

如果这是不好的做法,我还有哪些其他选择?

谢谢。


编辑。 (推理)

我这样做的原因是因为我正在创建多种类型的输出对象,而这些不同的输出对象需要不同的答案。

我正在做的计算可能会花费很多时间,所以我希望他们只计算他们需要的。

通过让这两个类相互了解,我将调用 Room 上的一个属性,它需要来自 House 的输入,它只会在我实际需要时才计算。

例如

public class Room {
public House House { get; set; }
public double Size { get; set; }

public double GetSizePercent()
{
return Size / House.TotalSize;
}
}

在我的实际应用程序中,有更多的属性可以从 House 类访问,在这个例子中,其他类也需要了解 House.TotalSize。

此外,在 House 上,我可能需要遍历属于它的所有 Rooms 以执行其他计算。

我希望这很清楚,如果没有,我可以尝试详细说明。

再次感谢。

最佳答案

我会考虑使用设置 House 属性的副作用来将其添加到集合中,这是一种不好的做法。属性 setter 应该设置属性。让它做一些不相关的事情,例如将对象添加到集合中,当其他人稍后试图遵循它时,会导致代码非常不可读。

我会做这样的事情:

public class House {
public House() {
Rooms = new List<Room>();
}
public Room CreateRoom() {
Room result = new Room(this);
Rooms.Add(result);
return result;
}
public List<Room> Rooms { get; private set; }

public class Room {
public Room(House house) {
this.House = house;
}
public House { get; private set; }
}
}

通常,我还想防止代码错误地使用我的类——例如创建一个链接到 House 的房间但忘记将其添加到 Rooms,或者将其添加到 Rooms 但错误地设置 House 属性。为了解决这个问题,我会实现这样的事情:

public class House {
private List<Room> rooms;
public House() {
rooms = new List<Room>();
Rooms = new ReadOnlyList<Room>(rooms);
}
public Room CreateRoom() {
Room result = ((IRoomFactory)Room.Factory.Instance).Create(this);
rooms.Add(result);
return result;
}
public ReadOnlyList<Room> Rooms { get; private set; }

private interface IRoomFactory {
Room Create(House house);
}

public class Room {
public class Factory : IRoomFactory {
public static readonly Factory Instance = new Factory();
Room IRoomFactory.Create (House house) {
return new Room(house);
}
}
private Room(House house) {
this.House = house;
}
public House { get; private set; }
}
}

然后,当你想给你的房子添加一个房间时,你只需调用

var house = new House();
var room = house.CreateRoom();

现在您不能从 House 类之外的任何地方创建房间,也不能从外部向类的 Rooms 集合添加房间。唯一的方法是在 House 内部,它通过 CreateRoom() 方法一次性处理所有链接和添加。

关于c# - 在类属性的 'value' 自动属性中设置 'set' 上的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41928310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com