我目前正在使用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)发送者的返回)。它不一定是发送者的引用,这段代码可能什么也不做。
但是很低,看来,它的工作方式与我想要的完全一样,并且最初认为它会。这让我想知道,演员是否总是返回对原始对象的引用?如果没有,我如何保证(按钮)发送者=发件人?
我知道双打/英寸不是这样,
public static int Main()
{
int a;
double b;
b = 10.5;
a = (int)b;
a++;
return 0;
}
最终为11,b为10.5但这可能是由于双打/整数是结构。这种行为让我很担心,很高兴知道它总是会返回一个引用,所以我可以把我的烦恼放在心里休息。
答案 0 :(得分:17)
参考类型。如果转换只是继承层次结构的上升或下降,那么是。这是参考转化。从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
之间)。
答案 1 :(得分:12)
对于通过继承层次结构输入的引用类型,它将始终引用同一个实例。但是,对于值类型,强制转换可能涉及装箱和拆箱,这将复制东西。除此之外,强制转换不仅仅在继承层次结构中。您可以声明自己的具有方法特征的强制转换运算符。它可以返回它喜欢的任何对象。