powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Boxing - аналог Variant?
14 сообщений из 14, страница 1 из 1
Boxing - аналог Variant?
    #32656670
Zugma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
Дело в следующем.
При работе с типом 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
Boxing - аналог Variant?
    #32656775
Zugma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Boxing - аналог Variant?
    #32657041
YaNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем собственно это надо?
неужто не хватает функционала .Net?
...
Рейтинг: 0 / 0
Boxing - аналог Variant?
    #32657131
Zugma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это надо затем, что мне самому нужно писать классы, которые будут оперировать данными неизвествного мне (на стадии написания программы) типа. Какую функциональность .Net для этого посоветуешь?
На C++ для таких случаев был тип Variant, в .Net его пока не видно...
...
Рейтинг: 0 / 0
Boxing - аналог Variant?
    #32657630
avg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аналог (почти) варианта в C# - object.
Копни в сторону рефлексии.
...
Рейтинг: 0 / 0
Boxing - аналог Variant?
    #32658289
Por
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Por
Гость
Столько копий было поломано в обсуждениях преимуществ 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
Boxing - аналог Variant?
    #32658350
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столько копий было поломано в обсуждениях преимуществ C# над VB.NET, а когда нужно ими воспользоваться про них забыли %)
"священные войны"

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

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
Boxing - аналог Variant?
    #32662031
Zugma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Boxing - аналог Variant?
    #32665697
viper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ведь можна и динамически код посторить... с шаблонами сей процесс гораздо проще...
_________________________________________________
Легче написать не правильную программу чем понять правильную (С) Alan Perlis
...
Рейтинг: 0 / 0
Boxing - аналог Variant?
    #32665888
Valera-x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Boxing - аналог Variant?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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