[Загадка] Null.Value
От: QrystaL Украина  
Дата: 11.10.10 12:56
Оценка: 14 (2)
    class Program
    {
        static void Main()
        {
            String a = Null.Value;
            Exception b = Null.Value;
            int? c = Null.Value;
        }
    }


Как реализован класс Null ?
Re: [Загадка] Null.Value
От: nikov США http://www.linkedin.com/in/nikov
Дата: 11.10.10 12:59
Оценка: +3 :)
Здравствуйте, QrystaL, Вы писали:

QL>Как реализован класс Null ?


class Null
{
    public static Null Value = new Null();

    public static implicit operator String(Null n)
    {
        return null;
    }

    public static implicit operator Exception(Null n)
    {
        return null;
    }
    
    public static implicit operator int?(Null n)
    {
        return null;
    }
}
Re: [Загадка] Null.Value
От: Sinix  
Дата: 11.10.10 13:00
Оценка: 16 (3)
Здравствуйте, QrystaL, Вы писали:

QL>Как реализован класс Null ?

class Program
  {
    static void Main()
    {
      String a = Null.Value;
      Exception b = Null.Value;
      int? c = Null.Value;

      String a2 = Null2.Value;
      Exception b2 = Null2.Value;
      int? c2 = Null2.Value;
    }
  }

  class Null
  {
    public static dynamic Value
    {
      get { return null; }
    }
  }

  class Null2
  {
    public static implicit operator string(Null2 value)
    {
      return null;
    }
    public static implicit operator Exception(Null2 value)
    {
      return null;
    }
    public static implicit operator int?(Null2 value)
    {
      return null;
    }

    public static Null2 Value
    {
      get { return null; }
    }
  }
Re[2]: [Загадка] Null.Value
От: QrystaL Украина  
Дата: 11.10.10 13:01
Оценка: 2 (1)
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, QrystaL, Вы писали:


QL>>Как реализован класс Null ?


N>
N>class Null
N>{
N>    public static Null Value = new Null();

N>    public static implicit operator String(Null n)
N>    {
N>        return null;
N>    }

N>    public static implicit operator Exception(Null n)
N>    {
N>        return null;
N>    }
    
N>    public static implicit operator int?(Null n)
N>    {
N>        return null;
N>    }
N>}
N>


Имелся в виду более универсальный вариант, по типу такого:
{Любой ссылочный тип} {идентификатор} = Null.Value; // Возвращает null
Re[3]: [Загадка] Null.Value
От: Аноним  
Дата: 11.10.10 13:08
Оценка:
Здравствуйте, QrystaL, Вы писали:

QL>Имелся в виду более универсальный вариант, по типу такого:

QL>{Любой ссылочный тип} {идентификатор} = Null.Value; // Возвращает null

Ну а конвертеры и переопределенные операторы не пойдут? Такое возможно в C# ?
Re[4]: [Загадка] Null.Value
От: QrystaL Украина  
Дата: 11.10.10 13:09
Оценка:
А>Ну а конвертеры и переопределенные операторы не пойдут? Такое возможно в C# ?

В смысле написать операторы на все возможные типы?
Re[2]: OFF: static dynamic
От: HowardLovekraft  
Дата: 11.10.10 14:25
Оценка: 1 (1) +2 :)
Мне одному "static dynamic" режет глаз?
Re[3]: OFF: static dynamic
От: QrystaL Украина  
Дата: 11.10.10 14:29
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Мне одному "static dynamic" режет глаз?


Ага, не очень логично смотрится =)
Re[4]: OFF: static dynamic
От: Sinix  
Дата: 11.10.10 14:31
Оценка:
Здравствуйте, QrystaL, Вы писали:

QL>Ага, не очень логично смотрится =)

Так вы не томите — угадал, нет?
Re[2]: [Загадка] Null.Value
От: QrystaL Украина  
Дата: 11.10.10 14:34
Оценка: +1 :)
S>
S>  class Null
S>  {
S>      public static dynamic Value
S>      {
S>          get { return null; }
S>      }
S>  }
S>


S>Так вы не томите — угадал, нет?


Да, всё верно )
Re[2]: [Загадка] Null.Value
От: Аноним  
Дата: 11.10.10 15:11
Оценка: 8 (1)
Здравствуйте, Sinix, Вы писали:

S> class Null

S> {
S> public static dynamic Value
S> {
S> get { return null; }
S> }
S> }

S>[/c#]


т.е. это нормальное применение dynamic?
получается можно писать фабрику таким макаром:

abstract class Car;
class Trunk : Car;
class Trunk : Car;

class CarFactory
{
Car Create(dynamic client)
{
return CreateCar(client);
}

Trunk Create(NewClient client)
{ return new Trunk(); }

Moto Create(OldClient client)
{ return new Trunk(); }
}
Re[3]: [Загадка] Null.Value
От: Sinix  
Дата: 11.10.10 15:32
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>т.е. это нормальное применение dynamic?

А>получается можно писать фабрику таким макаром:

Да, если вас не пугает Create("blablabla"). Впрочем, я бы решил дополнительными перегрузками или ручным кастингом.
Re[4]: [Загадка] Null.Value
От: Аноним  
Дата: 11.10.10 15:38
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>т.е. это нормальное применение dynamic?

А>>получается можно писать фабрику таким макаром:

S>Да, если вас не пугает Create("blablabla"). Впрочем, я бы решил дополнительными перегрузками или ручным кастингом.


например?
по вышеупомянотому примеру. надо мне по типу клиента создать для определенный тип ТС
Re[5]: [Загадка] Null.Value
От: Sinix  
Дата: 11.10.10 15:43
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>Да, если вас не пугает Create("blablabla"). Впрочем, я бы решил дополнительными перегрузками или ручным кастингом.


А>например?

А>по вышеупомянотому примеру. надо мне по типу клиента создать для определенный тип ТС

public Car Create(OldClient client)
{
  // ...
}
public Car Create(NewClient client)
{
  // ...
}
public Car Create(ClientBase client)
{
  OldClient old = client as OldClient;
  if (old != null)
  {
    return Create(old);
  }
  else
  {
    NewClient new = client as NewClient;
    // ...
  }
}
Re[6]: [Загадка] Null.Value
От: _FRED_ Черногория
Дата: 11.10.10 16:52
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>>>Да, если вас не пугает Create("blablabla"). Впрочем, я бы решил дополнительными перегрузками или ручным кастингом.

А>>например?
А>>по вышеупомянотому примеру. надо мне по типу клиента создать для определенный тип ТС
S>public Car Create(OldClient client)
S>{
S>  // ...
S>}
S>public Car Create(NewClient client)
S>{
S>  // ...
S>}
S>public Car Create(ClientBase client)
S>{
S>  OldClient old = client as OldClient;
S>  if (old != null)
S>  {
S>    return Create(old);
S>  }
S>  else
S>  {
S>    NewClient new = client as NewClient;
S>    // ...
S>  }
S>}


Ну зачем же самому заниматься диспетчеризацией? Выигрыша никакого не будет.

S>public Car CreateCar(OldClient client) { }
S>public Car CreateCar(NewClient client) { }

// Не компилил
private Car DynamicCreate(dynamic client) { return CreateCar(client);  }

S>public Car Create(ClientBase client)
S>{
    return DynamicCreate(client);
S>}


По функциональности ничем не отличается от варианта с "client as …", но кода много меньше, что особенно будет заметно при многих поддерживаемых Client-ах. Но со строкой вызвать уже не выйдет.
Help will always be given at Hogwarts to those who ask for it.
Re[7]: [Загадка] Null.Value
От: Lloyd Россия  
Дата: 11.10.10 16:59
Оценка: +2
Здравствуйте, _FRED_, Вы писали:

_FR>По функциональности ничем не отличается от варианта с "client as …",


Зависит от того, как в предложенном варианте обрабатывается ситуация, когда не найден ни один вариант.
Re[7]: [Загадка] Null.Value
От: Lloyd Россия  
Дата: 11.10.10 17:00
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Ну зачем же самому заниматься диспетчеризацией? Выигрыша никакого не будет.


_FR>
S>>public Car CreateCar(OldClient client) { }
S>>public Car CreateCar(NewClient client) { }

_FR>// Не компилил
_FR>private Car DynamicCreate(dynamic client) { return CreateCar(client);  }

S>>public Car Create(ClientBase client)
S>>{
_FR>    return DynamicCreate(client);
S>>}
_FR>


А в чем смысл дополнительного DynamicCreate? Проще сразу return CreateCar((dynamic)client)
Re[8]: [Загадка] Null.Value
От: _FRED_ Черногория
Дата: 11.10.10 17:08
Оценка:
Здравствуйте, Lloyd, Вы писали:

_FR>>Ну зачем же самому заниматься диспетчеризацией? Выигрыша никакого не будет.

S>>>public Car CreateCar(OldClient client) { }
S>>>public Car CreateCar(NewClient client) { }

_FR>>// Не компилил
_FR>>private Car DynamicCreate(dynamic client) { return CreateCar(client);  }

S>>>public Car Create(ClientBase client)
S>>>{
_FR>>    return DynamicCreate(client);
S>>>}


L>А в чем смысл дополнительного DynamicCreate? Проще сразу return CreateCar((dynamic)client)


Скорее всего. Не компилил, не разбирал, какие ещё хитрости могут быть.
Help will always be given at Hogwarts to those who ask for it.
Re[8]: [Загадка] Null.Value
От: Аноним  
Дата: 11.10.10 17:49
Оценка:
Здравствуйте, Lloyd, Вы писали:


L>А в чем смысл дополнительного DynamicCreate? Проще сразу return CreateCar((dynamic)client)


можно кратко для тех, кто пока не добрался до чтения про dynamic.
т.е. основное применение dynamic это динамическая подстановка типа как я привел здесь
Автор:
Дата: 11.10.10
?
вопрос отсутсвия имплементации ложится на плечи программера?
Re[9]: [Загадка] Null.Value
От: Sinix  
Дата: 11.10.10 23:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>т.е. основное применение dynamic это динамическая подстановка типа как я привел здесь
Автор:
Дата: 11.10.10
?


Не совсем, речь идёт о добавлении позднего связывания. Если совсем уплощённо — о переносе части работы для компилятора в рантайм. Например, разрешение перегрузок будет выполняться по тем же правилам, что и при компиляции.
Из возможных фич — облегчение работы со всяким COMом/динамически сгенерированным кодом/duck typing.

Другое дело, что применить dynamic во вред (снижение производительности/понятности программы, больше ошибок в рантайме) довольно легко. И, в принципе, добавление dynamic идёт слегка вразрез с попыткой принести в mainstream статическую валидацию кода aka CodeContracts.

А>вопрос отсутсвия имплементации ложится на плечи программера?

DLR прожуёт что сможет, что не сможет — выплюнет исключением
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.