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

我目前正在使用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)的返回。 它不一定是发送者的引用,这段代码可能什么都不做。

但是很低,它看起来就像我想要的那样,并且最初认为它会。 这让我想知道,演员是否总是返回对原始对象的引用? 如果没有,我如何保证(按钮)发件人=发件人?

我知道双打/英联的情况并非如此

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

最终得到11,b为10.5但这可能是由于双打/整数是结构。 这种行为让我感到担忧,并且知道它总会返回一个引用会很好,所以我可以把我的烦恼放在心里rest。

适用于参考类型。 如果转换只是inheritance层次结构的上升或下降,那么是。 这是参考转换 。 从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 } } 

像这样的用户定义的转换是相对罕见的。

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

对于通过inheritance层次结构传递的引用类型 ,它将始终引用同一实例。 但是,对于值类型,强制转换可能涉及装箱和拆箱,这将复制内容。 除此之外,强制转换不仅仅在inheritance层次结构中。 您可以声明自己的具有方法特征的强制转换运算符。 它可以返回它喜欢的任何对象。