如何禁止在 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"。
我想要实现的是:
- "myRefToBar"自动指向新的"bar"对象,或者
- 首先禁止复制"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 的引用在本地方法中途变得无效而我没有调用明显是我的错的东西,我仍然会感到惊讶。
是否可以禁止制作 public 字段或 属性 的参考副本,如下例所示?
Foo foo = new Foo();
foo.bar.DoSomething(); // That's fine
Bar myRefToBar = foo.bar; // Don't allow this!
当 "bar" 在 "foo" 中交换时,"myRefToBar" 仍将指向原始的 "bar"。
我想要实现的是:
- "myRefToBar"自动指向新的"bar"对象,或者
- 首先禁止复制"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 的引用在本地方法中途变得无效而我没有调用明显是我的错的东西,我仍然会感到惊讶。