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

C# 如何禁止在C中复制公共字段或属性#,c#,properties,field,wrapper,C#,Properties,Field,Wrapper,是否可以禁止制作公共字段或属性的引用副本,如以下示例所示 Foo-Foo=new-Foo(); foo.bar.DoSomething();//那很好 Bar myRefToBar=foo.Bar;//不要允许这样! 当在“foo”中交换“bar”时,“myRefToBar”仍将指向原始的“bar” 我想要实现的是: “myRefToBar”自动指向新的“bar”对象,或 首先禁止复制“bar” 显而易见的解决方案是将“bar”设为私有,并编写如下包装函数: class-Foo { 私人酒

是否可以禁止制作公共字段或属性的引用副本,如以下示例所示

Foo-Foo=new-Foo();
foo.bar.DoSomething();//那很好
Bar myRefToBar=foo.Bar;//不要允许这样!
当在“foo”中交换“bar”时,“myRefToBar”仍将指向原始的“bar”

我想要实现的是:

  • “myRefToBar”自动指向新的“bar”对象,或
  • 首先禁止复制“bar”
显而易见的解决方案是将“bar”设为私有,并编写如下包装函数:

class-Foo
{
私人酒吧;
公共无效DoSomethingWithBar()
{
bar.DoSomething();
}
}

但假设“Bar”有数百个函数,我希望所有函数都可用,我需要编写数百个包装,还是有一种更简单的方法来实现这一点?

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

当在“foo”内交换“bar”时,“myRefToBar”仍将指向 到原来的“酒吧”

是的,没错。你会经常交换酒吧吗?是否有某种迹象表明bar将失效?如果我正在使用一个公开引用的类,除非调用
ReplaceBar(newBar)

我想要实现的是:
•“myRefToBar”自动指向新的“bar”对象,或
•首先禁止复制“bar”

我不知道你们为什么会有这个目标,要清楚酒吧可以改变,当它改变了,最好是什么时候会改变

显而易见的解决方案是将“酒吧”私有化,并编写一个 包装函数

实际上,对我来说,最明显的解决方案是命名bar
CurrentBar
,或者使用一个方法
GetTemporaryBar()
,表明它发生了变化。
我要做的第二步是,如果条形图可能无效,我会将其设置为“IDisposable”,并在交换旧条形图时将其处理掉。在无效的
条上调用的任何方法现在都应该引发
ObjectDisposedException
;如果我对bar的引用在一个本地方法的中途无效,而我没有调用一些明显是我的错误的东西,我仍然会感到惊讶。

正确的方法是确保你没有在使用
foo.bar的代码中做傻事。试图以这种方式解决语言语义问题不会带来好的设计。此外,答案是“否”,至少,如果您希望拥有类型为
Bar
的公共属性,则答案是“否”。看:我认为“显而易见的解决方案”是最好的。包装愉快。
“Bar”有数百个功能,我希望所有功能都可用
听起来像是问题-关注点分离。将其分解为小规模的接口,并对逻辑功能进行分组。您可能会发现
Foo
不需要全部,也不需要全部公开。我喜欢
IDisposable
方法,就像我的情况一样,
Bar
是一个通信链接,可能会失效并被自动替换。因此,使用旧引用的人将获得您建议的
ObjectDisposedException