Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Boxing - аналог Variant? / 14 сообщений из 14, страница 1 из 1
19.08.2004, 13:23
    #32656670
Zugma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
Привет!
Дело в следующем.
При работе с типом Variant в C++Builder можно было производить сравнение типов без явного приведения типов:
Код: plaintext
1.
2.
3.
4.
5.
int a=5, b=10;
Variant aV = a;
Variant bV = b;
if (aV < bV)
{ //проверка удалась 
};
- т.е. автоматически проверяется тип содержащегося внутри Variant объекта и уже для этого типа применяется нужный оператор сравнения.
Вопрос: как сделать такое же в C#?
Пробовал прикрутить boxing, но для него обязательно явно в исходном коде преобразовывать тип:
Код: plaintext
1.
2.
3.
4.
5.
6.
int a=5;
int b=10;
object box1 = a;
object box2 = b;
if ((int)box1 < (int)box2)
{ //проверка удалась 
};
В моем случае, я не знаю заранее тип исходных данных, поэтому в тексте программы такие явные преобразования делать заранее, естественно, не могу.
Хотя у меня во время выполнения будут извесны 'настоящие' типы 'хранимых' данных (посредством System.Type), но все-таки хотелось бы обойтись без лишней писанины.
Как быть?
Заранее большое спасибо.
...
Рейтинг: 0 / 0
19.08.2004, 13:52
    #32656775
Zugma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
P.S.
Под "лишней писаниной" я имею в виду примерно следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public enum Operators {oLess, oEqual, oBigger};

public class Helper
{	static public bool Compare(object aArg1, object aArg2, Operators aOp)
	{
		if (aOp == Operators.oLess)
		{		 if (aArg1 is bool) return ((bool)aArg1 != (bool)aArg2);
			else if (aArg1 is int) return ((int)aArg1 < (int)aArg2);
			else if (aArg1 is float) return ((float)aArg1 < (float)aArg2);
			else if (aArg1 is string) return (((string)aArg1) != (string)aArg2);
		}
		else if (aOp == DataAccess.Operators.oEqual)
		{		 if (aArg1 is bool) return ((bool)aArg1 == (bool)aArg2);
			else if (aArg1 is int) return ((int)aArg1 == (int)aArg2);
			else if (aArg1 is float) return ((float)aArg1 == (float)aArg2);
			else if (aArg1 is string) return ((string)aArg1 == (string)aArg2);
		};
		return false;
	}
};
******************************
int a = 5;
int b = 9;
object box1 = a;
object box2 = b;

if (Helper.Compare(box1,box2,Operators.oLess))
{ //проверка удалась 
};
...
Рейтинг: 0 / 0
19.08.2004, 15:06
    #32657041
YaNN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
а зачем собственно это надо?
неужто не хватает функционала .Net?
...
Рейтинг: 0 / 0
19.08.2004, 15:27
    #32657131
Zugma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
Это надо затем, что мне самому нужно писать классы, которые будут оперировать данными неизвествного мне (на стадии написания программы) типа. Какую функциональность .Net для этого посоветуешь?
На C++ для таких случаев был тип Variant, в .Net его пока не видно...
...
Рейтинг: 0 / 0
19.08.2004, 18:29
    #32657630
avg
avg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
Аналог (почти) варианта в C# - object.
Копни в сторону рефлексии.
...
Рейтинг: 0 / 0
20.08.2004, 10:42
    #32658289
Por
Por
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
Столько копий было поломано в обсуждениях преимуществ C# над VB.NET,
а когда нужно ими воспользоваться про них забыли %)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class MyClass
{
   public void MyMethod()
   {
       int x = 1;
       int y = 2;
       return y MoreThen x;
   }
   public static bool operator MoreThen(object a, object b) 
   {
      bool result = false;

      if(a.GetType().Equals(typeof(int)) && 
             b.GetType().Equals(typeof(int)))
          result = (int)a > (int)b;

      return result;
   }
}
...
Рейтинг: 0 / 0
20.08.2004, 10:58
    #32658350
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
Столько копий было поломано в обсуждениях преимуществ C# над VB.NET, а когда нужно ими воспользоваться про них забыли %)
"священные войны"

<OFF>
?? Generics ??
</OFF>
...
Рейтинг: 0 / 0
20.08.2004, 10:58
    #32658352
viper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
Ну и в догонку фича C#2.0 Genetics даже анбоксить не надо :)
_________________________________________________
Легче написать не правильную программу чем понять правильную (С) Alan Perlis
...
Рейтинг: 0 / 0
20.08.2004, 17:15
    #32659647
Zugma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
авторСтолько копий было поломано в обсуждениях преимуществ C# над VB.NET, а когда нужно ими воспользоваться про них забыли %
Хм... спасибо, конечно, но ты написал то же самое явное преобразование типов при сравнении "result = (int)a > (int)b", (только зашитое в оператор), что и в приведенном мною 'плохом' коде...
авторC#2.0 Genetics
Это что такое? в общих чертах?
...
Рейтинг: 0 / 0
20.08.2004, 19:39
    #32659845
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
в формате Word:
C# 2.0 Specification
есть в help'е для
Visual C# 2005 Express Edition Beta
...
Рейтинг: 0 / 0
20.08.2004, 19:43
    #32659849
viper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
Ну если на сях писал то типа шаблонов... а если нет то:

Generic classes are classes that aren't type specific. Instead of creating a special class for manipulating integers, and then a second class for manipulating floating point numbers, you can create one generic class that can do both. For example, the following code creates a generic class for implementing a stack. A stack is a data structure that works in a "last in, first out" manner. You use the Push method to add values onto the stack to store them, and the Pop method to retrieve them.

This stack will store up to 100 items of any data type. If you are going to use this code in a real application, you need to add checks to make sure too many items are not popped or pushed, as this will cause an exception.

Notice that in the stack class definition, the label between angled brackets, in this case itemtype, is a placeholder for the data type. Notice also the use of private and public — the only public parts of the Stack class are the Push and Pop methods. The items array that stores the data and the stack counter variable is hidden. This makes for safer code.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
public class Stack< itemtype >
    {
         // Declare storage space for the stack. 
        private itemtype[] items = new itemtype[100];

         // Define a generic Push method. 
        public void Push(itemtype data)
        {
             // To do: check for stackcount out of range. 
            items[stackcounter++] = data;
        }

         // Define a generic Pop method. 
        public itemtype Pop()
        {
             // To do: check for stackcount out of range. 
            return items[--stackcounter];
        }

         // This variable stores the location of the current object in the stack. 
        private int stackcounter = 0;
    }
    class Program
    {
        static void Main(string[] args)
    {
            // Create an instance of the stack, this one for integers. 
            Stack<int> myintstack = new Stack<int>();
             // Store some values. 
            for (int i = 1; i < 10; i++)
                myintstack.Push(i*10);
             // Retreive the values. 
            for (int i = 1; i< 10; i++)
                Console.WriteLine(myintstack.Pop());
            // Create an instance of the stack, this one for strings. 
            Stack<string> mystringstack = new Stack<string>();
             // Store some values. 
            mystringstack.Push("World");
            mystringstack.Push("Hello");
             // Retreive the values. 
            Console.WriteLine(mystringstack.Pop());
            Console.WriteLine(mystringstack.Pop());
            Console.ReadLine();
        }
    }


_________________________________________________
Легче написать не правильную программу чем понять правильную (С) Alan Perlis
...
Рейтинг: 0 / 0
23.08.2004, 20:44
    #32662031
Zugma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
viperНу если на сях писал то типа шаблонов...
Хех! Так это шаблоны-родимые и есть!
А C# 2.0 Specification я пока не начал читать - еще только v1.2 дочитываю...
Шаблоны - это, конечно, хорошо, но они в данном случае тоже малопригодны, т.к. при все свое универсальности, типы в них должны быть 'подставлены' тоже до компиляции, а у меня получается что все в RunTim'e происходит.
Короче, взялся я писать класс Variant на C# на основе boxing'а...
и столкнулся с интересной вещью:
Как в C# реализовать "opreator="?
Т.е. чтобы код:
Код: plaintext
1.
MyClass old = new MyClass();
MyClass new = old;
во второй строке не 'указатель' присваивался, а вызывался метод наподобие 'MyClass.opreator=' для 'обдуманного' копирования значения полей класса?
...
Рейтинг: 0 / 0
25.08.2004, 20:14
    #32665697
viper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
Ну ведь можна и динамически код посторить... с шаблонами сей процесс гораздо проще...
_________________________________________________
Легче написать не правильную программу чем понять правильную (С) Alan Perlis
...
Рейтинг: 0 / 0
26.08.2004, 08:41
    #32665888
Valera-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Boxing - аналог Variant?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int a=5;
int b=10;
object box1 = a;
object box2 = b;

if (((IComparable)box1).CompareTo(box2)<0)
{
  Console.WriteLine("true");
}
else
{
  Console.WriteLine("false");
}
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Boxing - аналог Variant? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]