Здравствуйте, 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# ?
Здравствуйте, Аноним, Вы писали:
А>т.е. это нормальное применение dynamic? А>получается можно писать фабрику таким макаром:
Да, если вас не пугает Create("blablabla"). Впрочем, я бы решил дополнительными перегрузками или ручным кастингом.
Re[4]: [Загадка] Null.Value
От:
Аноним
Дата:
11.10.10 15:38
Оценка:
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>т.е. это нормальное применение dynamic? А>>получается можно писать фабрику таким макаром:
S>Да, если вас не пугает Create("blablabla"). Впрочем, я бы решил дополнительными перегрузками или ручным кастингом.
например?
по вышеупомянотому примеру. надо мне по типу клиента создать для определенный тип ТС
Здравствуйте, Аноним, Вы писали:
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;
// ...
}
}
Здравствуйте, 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.
Здравствуйте, 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 это динамическая подстановка типа как я привел здесь
Не совсем, речь идёт о добавлении позднего связывания. Если совсем уплощённо — о переносе части работы для компилятора в рантайм. Например, разрешение перегрузок будет выполняться по тем же правилам, что и при компиляции.
Из возможных фич — облегчение работы со всяким COMом/динамически сгенерированным кодом/duck typing.
Другое дело, что применить dynamic во вред (снижение производительности/понятности программы, больше ошибок в рантайме) довольно легко. И, в принципе, добавление dynamic идёт слегка вразрез с попыткой принести в mainstream статическую валидацию кода aka CodeContracts.
А>вопрос отсутсвия имплементации ложится на плечи программера?
DLR прожуёт что сможет, что не сможет — выплюнет исключением