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

在C#中强制转换对象是否总是返回对初始对象的引用,c#,casting,C#,Casting,我目前正在用C#做一个使用windows窗体的项目。在此过程中,我做了以下几点 void HideButtons(object sender, EventArgs e) { Button hider = ((Button)sender); foreach(Button tohide in hider.Parent.Controls) tohide.Hide(); hider.Show();

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

        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是它唯一的对象,是从((按钮)发送方返回的。它不一定是对发送者的引用,而且这段代码可能什么都不会做

但是很低,瞧,它的工作原理和我想要的和最初认为的完全一样。这让我想知道,强制转换是否总是返回对原始对象的引用?如果不是,我如何保证(按钮)发送者=发送者

我知道double/int不是这样的,正如

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

最终a为11,b为10.5,但这可能是由于double/int为structs。这种行为让我担心,如果知道它总是会返回一个引用,那么我就可以放心了。

对于通过继承层次结构铸造的引用类型,它总是引用同一个实例。但是,对于值类型,强制转换可能涉及装箱和取消装箱,这将复制内容。除此之外,强制转换不仅仅存在于继承层次结构中。您可以声明自己的cast操作符,它具有方法的特征。它可以返回它喜欢的任何对象。

对于引用类型。如果强制转换只是继承层次结构的上下转换,那么是。这是一个引用转换。根据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
    }
}
像这样的用户定义转换相对较少


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

我对C是新手。有没有办法确定传递的对象是value\u类型还是reference\u类型?这是一个很好的问题。这里有一些关于cast何时更改表示而不是保留标识的注释。这可能会让人很困惑。