C#:例如集合的封装

2024-03-19

我想知道其中哪一个被认为是最干净或最好用的以及为什么。

其中一个公开乘客列表,允许用户添加和删除等。另一个隐藏列表,只允许用户枚举它们并使用特殊方法添加。

实施例1

class Bus
{
    public IEnumerable<Person> Passengers { get { return passengers; } }
    private List<Passengers> passengers;

    public Bus()
    {
        passengers = new List<Passenger>();
    }

    public void AddPassenger(Passenger passenger)
    {
        passengers.Add(passenger);
    }
}

var bus = new Bus1();
bus.AddPassenger(new Passenger());
foreach(var passenger in bus.Passengers)
    Console.WriteLine(passenger);

实施例2

class Bus
{
    public List<Person> Passengers { get; private set; }

    public Bus()
    {
        Passengers = new List<Passenger>();
    }
}

var bus = new Bus();
bus.Passengers.Add(new Passenger());
foreach(var passenger in bus.Passengers)
    Console.WriteLine(passenger);

我想说的第一个类封装得更好。在这种情况下,这可能是更好的方法(因为您可能应该确保公交车上还有剩余空间等)。但我想在某些情况下第二类也可能有用?就像班级并不真正关心该列表会发生什么一样,只要它有一个列表即可。你怎么认为?


在示例一中,可以改变您的集合。

考虑以下:

var passengers = (List<Passenger>)bus.Passengers;

// Now I have control of the list!
passengers.Add(...);
passengers.Remove(...);

要解决这个问题,您可以考虑这样的事情:

class Bus
{
  private List<Passenger> passengers;

  // Never expose the original collection
  public IEnumerable<Passenger> Passengers
  {
     get { return passengers.Select(p => p); }  
  }

  // Or expose the original collection as read only
  public ReadOnlyCollection<Passenger> ReadOnlyPassengers
  {
     get { return passengers.AsReadOnly(); }
  }

  public void AddPassenger(Passenger passenger)
  {
     passengers.Add(passenger);
  }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:例如集合的封装 的相关文章

随机推荐

  • 在我按照 OWAPS 和 Roslyn Security Guard 的建议应用解决方案后,Veracode 仍然报告操作系统命令注入问题

    我的项目中的当前代码如下所示 Veracode 报告存在操作系统命令注入 filename Regex Replace filename a zA Z0 9 svg ProcessStartInfo startInfo default Pr
  • iOS 9 - Facebook 无法打开已安装的 iOS 应用程序

    iOS 9 和 Facebook 问题 在 iOS9 之前 Facebook 帖子可以通过短 URL 例如 bet365 成功地将用户重定向到已安装的应用程序 现在 在 iOS 9 中 bet365 给出无效链接 从 Safari 可以正常
  • 注册表观察程序 C#

    我是 WMI 的新手 我需要实施注册表值更改事件 http msdn microsoft com en us library aa393042 VS 85 aspx在 C 服务中 我需要一个事件处理程序 每次更改一组注册表值中的任何一个值时
  • C++ 中排列、组合和 PowerSet 的实现 [重复]

    这个问题在这里已经有答案了 我正在寻找使用 C 实现排列 组合和幂集 使用STL 排列 using std next permutation template
  • Char* 字符数组,但 int* 不是整数数组?

    在 C99 中 字符串通常通过使用char 数据类型 因为没有原始的 字符串 数据类型 通过将第一个字符的地址存储在变量中 这有效地创建了一个字符数组 FILE out fopen out txt w char s argv 1 fwrit
  • 为什么执行sonar:sonar时找不到sonar-maven-plugin-3.0.1.jar?

    我们目前正在将 重新激活 声纳纳入我们的持续构建过程中 但我们遇到了一些问题 为了只专注于声纳 我尝试让它在 HelloWorld 项目上工作 但仍然没有成功 repo1 和 repo2 中似乎缺少一个 jar sonar maven pl
  • 启动长时间后台任务

    用户请求我网站上的某些页面 我想做的事 向用户发送快速答案并启动需要很长时间的后台任务 看起来像 public ActionResult index var task new Task Stuff start task async task
  • 删除自定义 ActionBar 中的多余空间

    我的问题涉及使用完全自定义的 ActionBar 视图 因为这对于我的客户希望 ActionBar 的工作方式是必要的 我已经删除了徽标 标题和其他所有可能的内容 但是 ActionBar 的自定义视图不会一直延伸到整个屏幕 我尝试了以下方
  • 单击图像时播放 MP3

    我想在单击网站中的某个图像时播放 MP3 文件 我还想隐藏 MP3 文件 我怎样才能做到这一点 我尝试了这段代码 但没有任何反应
  • BOT/蜘蛛陷阱创意

    我有一个客户 他的域名似乎受到 DDoS 攻击的严重打击 在日志中 看起来很正常的具有随机 IP 的用户代理 但它们翻阅页面的速度太快 不像人类 他们似乎也没有要求任何图像 我似乎找不到任何模式 我怀疑这是一群 Windows 僵尸 客户过
  • 更快地重新连接 CBPeripheral

    我正在开发一个应用程序 它可以多次连接和断开不同的蓝牙低功耗外围设备 经过在互联网上的大量研究 我没有找到一种方法来存储已经发现的服务和特征 以便我可以更快地重新连接 目前 我正在每次重新连接后发现所需的服务和特征 这花费了我 1 5 到
  • 打字稿错误 get 调用需要 0 个类型参数

    我收到打字稿错误预期 0 类型参数 但返回 get 调用的行却得到 1 我的通话有什么问题吗 public get params SummaryParams Observable
  • “OutOfMemoryException”读取 20mb XLSX 文件

    我在用着NPOI https www nuget org packages NPOI 来处理Excel文件 这是我读取文件的方式 using FileStream stream File OpenRead excelFilePath IWo
  • fill-rule="evenodd" 如何在星形 SVG 上工作

    当我试图理解时 我看到了以下 svg 形状fill rule in SVG div class contain demo div
  • 该浮点数小数部分的前 32 位是多少?

    我正在看以下内容SHA256 伪代码 http en wikipedia org wiki SHA 2 SHA 256 28a SHA 2 variant 29 pseudocode在维基百科上 具体来说 我正在查看以下部分 Initial
  • 打印文本而不是 C 枚举中的值

    int main enum Days Sunday Monday Tuesday Wednesday Thursday Friday Saturday Days TheDay int j 0 printf Please enter the
  • EF 映射对象的不兼容数据读取器异常

    我正在使用实体框架并更新了表及其存储过程 但在调用存储过程时出现以下错误 数据读取器与指定的不兼容 FormValueModel Valuation 类型的成员 ValuationId 确实 数据读取器中没有同名的相应列 Valuation
  • 如何设计一个带有需要引用自身的表的数据库?

    我正在构建一个数据库 但遇到了一个我似乎无法解决的问题 数据库比图中复杂得多 但问题可以归纳为下面的表结构 问题是每个员工都有一个经理 每个经理都是员工 看起来这些表必须互相引用 但是 当我设置它时 这似乎无法正常工作 我正在使用cakep
  • 使用单个服务器端变量处理多个复选框

    我有以下 HTML 代码
  • C#:例如集合的封装

    我想知道其中哪一个被认为是最干净或最好用的以及为什么 其中一个公开乘客列表 允许用户添加和删除等 另一个隐藏列表 只允许用户枚举它们并使用特殊方法添加 实施例1 class Bus public IEnumerable