Re[3]: Нововведения в C# 2.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.07.04 13:11
Оценка:
Здравствуйте, Andir, Вы писали:

A>А как оно теперь объявляется? Получить понятно, а как реализовали объявление для своего типа??


Не совсем понял вопрос. В общем, вот пример использования:
class A<T>
{
}

class B<T>
{
    A<T> _a;

    public void Method()
    {
        if (чтоТоТам)
            _a = new A<T>();
        else
            _a = default(A<T>);
    }
}
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Нововведения в C# 2.0
От: Andir Россия
Дата: 13.07.04 01:46
Оценка:
Здравствуйте, VladD2, Вы писали:

A>>А как оно теперь объявляется? Получить понятно, а как реализовали объявление для своего типа??


VD>Не совсем понял вопрос. В общем, вот пример использования:


Что-то переклинило Уже и так понял, что к чему. Почему-то подумалось, что неплохо было бы управлять содержимым default(MyType<T>).
Я правильно понимаю, что при сравнении с любой инстаниацией дженерика будет возвращаться false?
class A<T>{}

class B
{
    public void Test(A<int> testParam)
    {
        if(testParam != null && testParam != default(A<int>))
        {
            // Действия с testParam
        }
        return;
    }
}


То есть для параметров Дженериков необходимо две проверки против одной?

А что будет в таком случае?

class A<T> where T: new()
{    
    private T _val = new T();
    public void WhoIs(){Console.WriteLine("A<" + _val.GetType().Name + ">");}
}

class B
{
    public void Test()
    {
        A<int> test = default(A<int>);
        
        test.WhoIs();
    }
}


С Уважением, Andir!
<< using(RSDN@Home 1.1.4 beta 2){/* Работаем */} >>
Re[5]: Нововведения в C# 2.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.07.04 19:16
Оценка:
Здравствуйте, Andir, Вы писали:

A>Я правильно понимаю, что при сравнении с любой инстаниацией дженерика будет возвращаться false?

A>
A>class A<T>{}

A>class B
A>{
A>    public void Test(A<int> testParam)
A>    {
A>        if(testParam != null && testParam != default(A<int>))
A>        {
A>            // Действия с testParam
A>        }
A>        return;
A>    }
A>}
A>


Если под "инстаниацией" имеется в виду сравнение с экземпляром, то нет. Если testParam (а точнее A<int>) — это ссылочный тип, то default(A<int>) будет являться null-ом (а сталобыть вторая проверка не что иное как дубляж). Если же A<int> — это вэлью-тип, то сравнение с null всегда будет ложным (соотвественно проверка на неравенство истенным), а сравнение с default(A<int>) будет производиться по значению (и выдаст истину если testParam заполнен нулями и null-ами).

Ну, и естествнно, если для типа определен оператор стравнения, то будет вызван именно он.

A>То есть для параметров Дженериков необходимо две проверки против одной?


Дженерики такие же в точности типы. Вообщем, все что написано в этом статье относительно инициализации дженериков верно. Изменился только синтаксис получения значения по умолчанию.

A>А что будет в таком случае?


A>
A>class A<T> where T: new()
A>{    
A>    private T _val = new T();
A>    public void WhoIs(){Console.WriteLine("A<" + _val.GetType().Name + ">");}
A>}

A>class B
A>{
A>    public void Test()
A>    {
A>        A<int> test = default(A<int>);
        
A>        test.WhoIs();
A>    }
A>}
A>


Будет исключение NullReferenceException в вделенном жирным коде, так как default для ссылочных типов всегда равен null-у. Если А объявить как структуру, то код просто не скомпилируется, так как для структур запрещена инлайн-инициализация и конструктроры без параметров. Поверь все это сделано не случайно. Под этими решениями лежит нехилая логическая база.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Нововведения в C# 2.0
От: Andir Россия
Дата: 14.07.04 00:06
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Будет исключение NullReferenceException в вделенном жирным коде, так как default для ссылочных типов всегда равен null-у. Если А объявить как структуру, то код просто не скомпилируется, так как для структур запрещена инлайн-инициализация и конструктроры без параметров. Поверь все это сделано не случайно. Под этими решениями лежит нехилая логическая база.


Верю, верю ... искал понимание, понимание пришло Немного себе не так представлял механизм default, думал, что это некоего рода маркер для значений дженериков. Обшибся. Исправлюсь

С Уважением, Andir!
<< using(RSDN@Home 1.1.4 beta 2){/* Работаем */} >>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.