当前位置: 首页 > 面试题库 >

返回引用类型的方法是否返回引用或克隆副本?

郎意
2023-03-14
问题内容

这些天来我一直在学习Java,而我读到的"Be careful not to write accessor methods that return references to mutable objects"才是真正有趣的。现在,我想知道C#中的Properties和Accessor方法是否相同?还是C#已经自动返回克隆的副本?

谢谢。


问题答案:

引用就是……对存储在内存中的某个对象的引用。除非您明确编写代码以创建克隆并返回对该对象 的引用 ,否则您将始终绕过对同一实例的引用。

它试图避免您遇到的情况是将对象引用移交给您所依赖的调用方。您无法控制谁或什么改变了该对象的状态,因此您的类可能会以不可预测的结果结束。

一个愚蠢的例子:

public class Employee
{
    public Salary Salary {get; set;}

    public void GiveRaise()
    {
        Salary.Total *= .25;

        if(Salary.Total > 100000)
        {
            Promote();
            GiveBiggerOffice();
        }
        else
        {
            GiveWatch();
        }
    }
}

因此,可以说这个人的薪水为50,000美元,并且刚刚加薪。现在他的薪水是62,500美元,他应该会得到一块不错的新表。但是,另一个线程很可能对此Employee对象进行了引用。这意味着他们也可以使用该Salary物业,并可能在if块运行之前将薪金总额更改为$
100,000以上。

在这种尴尬的情况下,即使该Raise()方法只被调用一次,该员工也将获得升职和新办公室。

我知道这很傻,但是可以说明这一点。



 类似资料:
  • null 为了帮助进一步演示案例#2,3,4,下面的代码片段强调了当找不到客户时“可能发生”的几个选项...

  • 大佬们,这样写在c++中会产生什么问题啊?

  • 本文向大家介绍PHP引用返回,包括了PHP引用返回的使用技巧和注意事项,需要的朋友参考一下 示例 有时,您有时需要隐式返回引用。 当您想使用函数查找引用应绑定到哪个变量时,按引用返回非常有用。不要使用引用返回来提高性能。引擎将自动自动对此进行优化。仅在有充分的技术理由时才返回引用。 取自PHP文档,供按引用返回。 通过引用返回可以采用许多不同的形式,包括以下示例: 通过引用返回不仅限于函数引用。您

  • 问题内容: 这就是我想要做的。使用反射,我想获取所有方法及其返回类型(非泛型)。我一直在这样做。但是,当我遇到返回类型未知的方法时,我遇到了限制。 我如何知道方法的返回类型是否通用?我没有奢求在运行时拥有对象。我正在尝试使用Google 或使用抽象类来获取类型信息。我想关联到对象的方法。 有人认为Java不保留通用信息。在这种情况下,为什么第一次强制转换有效而第二次强制转换无效。 任何帮助表示赞赏

  • 问题内容: 为什么当我们使用struct引用结构时,Go似乎会返回的新副本,而不是返回原始的相同地址?这可能是我的误解,所以我要求澄清 输出量 去操场 问题答案: 当你写 您正在复制(dereferences )指向的struct的值。它类似于: 所以是一个类型的新变量,被初始化为的值。这将导致具有不同的内存地址。 请注意,如果是type ,则while 是type 。但是它们是不同的值。更改of

  • 文件: Authentication authenticate(Authentication Authentication)抛出AuthenticationException使用与AuthenticationManager相同的约定执行身份验证。参数:authentication-身份验证请求对象。返回:包含凭据的经过完全身份验证的对象。如果AuthenticationProvider无法支持传递