¿Convertir un objeto en C # siempre devuelve una referencia al objeto inicial?

Actualmente estoy haciendo un proyecto en C # trabajando con formularios de Windows. Durante el transcurso de la misma, hice lo siguiente.

        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); 
    }

El propósito de este código es tener un botón que oculte todos los otros botones en el contenedor en el que se encuentra, excepto en sí mismo, y luego se convierta en un botón Mostrar que hace lo mismo a la inversa.

Ahora, eso está muy bien, excepto que, al compilar esto, me doy cuenta de que tengo un problema. hider es su objeto único, siendo el retorno desde ((Botón) remitente). No es necesariamente la referencia al remitente, y este código probablemente no hará nada.

Pero bajo y he aquí, funciona exactamente como lo quería y al principio pensé que lo haría. Lo que me hizo preguntarme si un modelo siempre devuelve una referencia al objeto original. Si no, ¿cómo garantizo que (botón) remitente = remitente?

Sé que no es el caso de los dobles / ints, como

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

termina con un ser 11 yb siendo 10.5 Pero eso puede deberse a que los dobles / ints sean estructuras. Este comportamiento me preocupa, y sería bueno saber que siempre devolverá una referencia para que pueda descansar mi mente preocupada.

Respuestas a la pregunta(2)

Su respuesta a la pregunta