在 C# 中转换对象是否总是返回对初始对象的引用

2024-04-14

我目前正在做一个使用 Windows 窗体的 C# 项目。在此过程中,我做了以下几件事

        void HideButtons(object sender, EventArgs e)
    {
        Button hider = ((Button)sender);
        foreach(Button tohide in hider.Parent.Controls)
            tohide.Hide();
        hider.Show();
        hider.Text = "UnHide";
        hider.Click -= new EventHandler(HideButtons);
        hider.Click += new EventHandler(ShowButtons); 
    }

此代码的目的是让一个按钮隐藏其所在容器中除其自身之外的所有其他按钮,然后变成一个取消隐藏按钮,该按钮反向执行相同的操作。

现在,一切都很好,除了当我编译这个时,我意识到我遇到了一个问题。 hider 是它的唯一对象,是 ((Button)sender) 的返回。它不一定是对发送者的引用,并且此代码可能什么也不做。

但你瞧,它的工作原理和我最初的想法完全一样。这让我想知道,强制转换是否总是返回对原始对象的引用?如果不是,我如何保证 (button)sender = sender?

我知道双打/整数的情况并非如此,因为

        public static int Main()
    {
        int a;
        double b;
        b = 10.5;
        a = (int)b;
        a++;
        return 0;
    }

最终 a 为 11,b 为 10.5 但这可能是由于 doubles/ints 是结构体。这种行为让我很担心,很高兴知道它总是会返回一个引用,这样我就可以放下我担心的心了。


对于参考类型。如果强制转换仅位于继承层次结构的上或下,那么是的。这是一个参考转换。来自 C# 3.0 语言规范,第 6.2.4 节:

引用转换,隐式或 明确,永远不要改变引用 物体的身份 转换。换句话说,虽然一个 引用转换可能会改变 引用的类型,它永远不会 改变的类型或值 被引用的对象。

这是您在 WinForms 代码中使用的情况。

但是,在其他(仍然引用类型)情况下,它可能会调用用户定义的转换。例如:

using System;

class Foo
{
}

class Bar
{
    public static explicit operator Bar(Foo f)
    {
        return new Bar();
    }
}

class Test
{
    static void Main()
    {
        Foo f = new Foo();
        Bar b = (Bar) f;
        Console.WriteLine(object.ReferenceEquals(f, b)); // Prints False
    }
}

像这样的用户定义的转换是相对地 rare.

对于值类型,有装箱和拆箱转换,以及其他转换(例如之间的转换)int and double).

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

在 C# 中转换对象是否总是返回对初始对象的引用 的相关文章

随机推荐