如何禁止在 C# 中复制 public 字段或 属性

How to prohibit making a copy of a public field or property in C#

是否可以禁止制作 public 字段或 属性 的参考副本,如下例所示?

Foo foo = new Foo();

foo.bar.DoSomething(); // That's fine
Bar myRefToBar = foo.bar; // Don't allow this!

当 "bar" 在 "foo" 中交换时,"myRefToBar" 仍将指向原始的 "bar"。

我想要实现的是:

显而易见的解决方案是将 "bar" 设为私有并编写一个包装函数,例如:

class Foo
{
  private Bar bar;

  public void DoSomethingWithBar()
  {
    bar.DoSomething();
  }
}

但是假设 "Bar" 有数百个函数,我希望所有函数都可用,我是否必须编写数百个包装器,或者是否有更简单的方法来实现它?

您通过编写 foo.Bar 所做的就是公开对该对象的引用。那时他们如何处理该对象取决于他们。他们可以存储它供以后使用(如 var bar = foo.Bar)或直接对其进行操作(如 foo.Bar.DoSomething())。正如您所说,阻止他们这样做的唯一方法就是根本不暴露它。

When "bar" gets exchanged inside "foo", "myRefToBar" will still point to the original "bar".

是的,没错。你可能会经常交换酒吧吗?是否有某种迹象表明 bar 将变得无效?如果我使用公开引用的 class,我不一定希望它们发生变化,除非我调用诸如 ReplaceBar(newBar)

之类的方法

What I'm trying to achive is that either:
• "myRefToBar" automatically Points to the new "bar" object, or
• prohibit making a copy of "bar" in the first place.

我不确定你为什么有这个目标,明确指出 bar 可以改变,当它改变的时候,最好是什么时候改变。

The obvious solution would be to make "bar" private and write a wrapper function

实际上对我来说最明显的解决方案是命名栏 CurrentBar 或使用一种方法 GetTemporaryBar() 来指示它发生变化。 我要做的第二步是,如果 Bar 可以无效,我会使其成为 IDisposable 并在我换出它时处理掉旧的 Bar。任何调用无效 Bar 的方法现在都应该引发 ObjectDisposedException;如果我对 bar 的引用在本地方法中途变得无效而我没有调用明显是我的错的东西,我仍然会感到惊讶。