C# 创建对象的新实例,还是修改现有实例?

C# 创建对象的新实例,还是修改现有实例?,c#,bittorrent,C#,Bittorrent,为了好玩,我尝试在C#中创建一个BitTorrent库作为一个附带项目。然而,我遇到了一个设计问题,如果我现在不解决它,以后可能会产生问题 我目前有一个PeerGreeter类,它将一个Socket置于侦听状态,供任何试图连接到我的对等方使用,以便为我提供torrent中的文件。当对等方连接时,迎宾员交换握手,确保所有内容都有效,然后触发一个PeerConnected事件,其中关联的Socket和握手信息作为处理程序参数 MyTorrent类是单个Torrent及其所有职责的表示,它有两个群中所

为了好玩,我尝试在C#中创建一个BitTorrent库作为一个附带项目。然而,我遇到了一个设计问题,如果我现在不解决它,以后可能会产生问题

我目前有一个
PeerGreeter
类,它将一个
Socket
置于侦听状态,供任何试图连接到我的对等方使用,以便为我提供torrent中的文件。当对等方连接时,迎宾员交换握手,确保所有内容都有效,然后触发一个
PeerConnected
事件,其中关联的
Socket
和握手信息作为处理程序参数

My
Torrent
类是单个Torrent及其所有职责的表示,它有两个群中所有对等方的列表(封装在
Peer
对象中),连接和断开。当迎宾员触发
PeerConnected
事件时,
Torrent
实例在断开连接列表中找到相应的
Peer
。如果找到一个,它会将其移动到已连接列表,并在其实例中将类型为
Socket
Connection
属性设置为由迎宾员创建的
Socket
。该属性是一个自动属性,其访问修饰符为:
{get;internal set;}

我遇到的问题是,据我所知,这不是线程安全的。如果一个线程正在处理一个
对等连接
,然后另一个线程以某种方式修改或处理该连接对象,则可能会产生问题。我考虑过将
连接
属性的setter的访问修饰符设置为
private
,并在构造函数中进行设置,但问题是我需要创建一个新对象来替换断开连接列表中的占位符
对等方
,以将其添加到连接列表中


我的问题是,我应该坚持将setter设置为
internal
,还是将其设置为private,并用一个全新的实例替换占位符也是一种很好的方法?

出于线程安全的目的,使类型尽可能不可变将为您省去很多麻烦。将访问器设置为私有(或者更好的是,将字段标记为
只读
),并在需要进行更改时生成新实例