Всегда ли приведение объекта в C # возвращает ссылку на исходный объект

В настоящее время я делаю проект на 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 - это его уникальный объект, являющийся возвратом от ((кнопки) отправителя). Это не обязательно ссылка на отправителя, и этот код, вероятно, ничего не сделает.

Но низко и вот, это работает точно так, как я хотел, и первоначально думал, что это будет. Что заставило меня задуматься: всегда ли актеры возвращают ссылку на исходный объект? Если нет, как я могу гарантировать, что (кнопка) отправитель = отправитель?

Я знаю, что дело не в двойных / целых, так как

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

в конечном итоге получается 11, а b 10,5. Но это может быть связано с тем, что структуры типа double / ints являются. Это поведение меня беспокоит, и было бы приятно узнать, что оно всегда будет возвращать ссылку, чтобы я мог успокоить свой беспокойный ум.

 Eric Lippert30 июн. 2009 г., 18:14
Отличный вопрос. Вот некоторые примечания о том, когда приведение изменяет представление по сравнению с сохранением идентичности. Это может быть довольно запутанным.blogs.msdn.com/ericlippert/archive/2009/03/19/…

Ответы на вопрос(2)

Решение Вопроса

Для справочных типов. если приведение только вверх или вниз по иерархии наследования, тогда да. Этоreference conversion, Из спецификации языка C # 3.0, раздел 6.2.4:

Reference conversions, implicit or explicit, never change the referential identity of the object being converted. In other words, while a reference conversion may change the type of the reference, it never changes the type or value of the object being referred to.

Это тот случай, который вы используете в своем коде WinForms.

Однако в других (все еще ссылочных типах) случаях он может вызыватьuser-defined conversion, Например:

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

Пользовательские преобразования, подобные этому,relatively редко.

Для типов значений существуют преобразования в упаковку и распаковку, а также в другие преобразования (например, междуint а такжеdouble).

Заreference types через иерархию наследования он всегда ссылается на один и тот же экземпляр. Однако для типов значений приведение может включать в себя упаковку и распаковку, которые будут копировать материал. Помимо этого, приведения не только в иерархии наследования. Вы можете объявить свой собственный оператор приведения, который имеет характеристики метода. Он может вернуть любой объект, который ему нравится.

 30 июн. 2009 г., 17:30
Я новичок в C #. Есть ли способ узнать, является ли переданный объект тип_значения или тип ссылки?
 30 июн. 2009 г., 17:31
if (obj is ValueType)

Ваш ответ на вопрос