Абстрактная переменная в C# ?

Программирование на Юнити.

Абстрактная переменная в C# ?

Сообщение Neodrop 15 апр 2009, 18:25

Возник вопрос, можно ли в C# функцию передать абстрактный тип данных?
К примеру, чтобы я внутри функции определил int она, float или bool.
Кто-нибудь в курсе как это сделать и возможно ли это вообще? :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Абстрактная переменная в C# ?

Сообщение Const_47 15 апр 2009, 19:08

Например в консольном приложении.

Код: Выделить всё
class Abstract
{

    public string name;
    public Abstract(){
        name = ";)";
    }
}

    class Program
    {
        public static void Function(Abstract A)
        {
            Console.WriteLine(A.GetType());
        }

        public static void Main(string[] args)
        {
            Abstract Test = new Abstract();
            Program.Function(Test);

        }
    }
Const_47
Герой Форума
 
Сообщения: 271
Зарегистрирован: 23 мар 2009, 19:24
Откуда: Украина. Львов\Новояворовск

Re: Абстрактная переменная в C# ?

Сообщение Neodrop 15 апр 2009, 20:37

От спасибки... Потом проверю. Иногда очень нужно.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Абстрактная переменная в C# ?

Сообщение Neodrop 22 июн 2009, 15:40

Вот и понадобилось.
Делается так:

Код: Выделить всё
System.Type type = obj.GetType();

if (type == typeof(mySomeType))
{
  // делаем что-то
}
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Абстрактная переменная в C# ?

Сообщение Astaror 24 июн 2009, 11:49

Интересное сравнение быстродействия различных вариантов проверки соответствия типов. Может кому пригодится :)

Data units of msec resolution = 0.279365 usec
10 typeof(string) : count: 10000 7.677 +- 3% msec
10 typeof(string).TypeHandle : count: 10000 0.000 +- >400% msec
10 anObj.GetType() == type : count: 10000 7.393 +- 41% msec
10 Type.GetTypeHandle(obj).Equals(tHnd) : count: 10000 4.554 +- 9% msec
10 anObj.GetType() == typeof(string) : count: 10000 0.103 +- 7% msec
10 (anObj is string) : count: 10000 0.594 +- 12% msec

http://blogs.msdn.com/vancem/archive/2006/10/01/779503.aspx - здесь можно прочитать подробнее о сравнении.

Ещё небольшой совет. В случае разветвлённой схемы наследования классов от, например, нескольких базовых интерфейсов вариант с Type не подойдёт, т.к. вернёт точный тип, но не вернёт возможность каста в родительский тип.
В таком случае лучше использовать конструкцию as\is, которая сработает на ура, с любым родительским интерфейсом/классом.
Astaror
UNец
 
Сообщения: 13
Зарегистрирован: 04 июн 2009, 12:44

Re: Абстрактная переменная в C# ?

Сообщение Mr_Anderson 24 июн 2009, 12:11

Это ж для MS .NET ;) В Юнити Mono фрейворк ;) сравнения могут не прокатить ;)
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: Абстрактная переменная в C# ?

Сообщение Neodrop 24 июн 2009, 12:29

Как это? Прокатят. Никакого различия. MONO это компиллятор.

Вот только, если проверять тип неизвестной переменной не через GetType то придётся использовать try - cath иначе не избежать исключений.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Абстрактная переменная в C# ?

Сообщение Astaror 24 июн 2009, 12:36

Использование as не генерирует исключений. В случае невозможности конвертации значение результирующей переменной будет null.
Каждый использует то, что ему удобнее, но сравнение быстродействия ИМХО достаточно интересное :)
Astaror
UNец
 
Сообщения: 13
Зарегистрирован: 04 июн 2009, 12:44

Re: Абстрактная переменная в C# ?

Сообщение Mr_Anderson 24 июн 2009, 13:35

Значит по вашему, Нео, два разных фреймворка и компилятора всегда дают идентичный результат на однотипных операциях? Реализация-то разная у каждого из них, несмотря на схожий синтаксис и функционал. Подобный тест на МОНО надо делать для полноты картины... на том же Юнити, например.
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: Абстрактная переменная в C# ?

Сообщение Neodrop 24 июн 2009, 13:41

Это согласен, конечно. :-B
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7