DG>>но еще раз повторяю, что данный код совсем не равносилен исходному примеру, и может выдавать некорректный результат для многопоточного приложения DG>>или для кода с side-эффектами.
S>Это почему?
Потому что при такой записи вызовы свойств происходят несколько раз, поэтому при первом вызове может быть не null, а при втором вызове уже null, такое возможно если мы работаем с многопоточным приложением (и какой-то другой поток сбросил свойство), или с кодом, который имеет side-эффекты (и меняет значение свойства во время вызова)
допустим у нас есть свойство Name с side-эффектом (которое, то устанавливает свойство, то его сбрасывает) в классе User
public string Name
{
get
{
if (_Name == null)
_Name = "Вася";
else
_Name = null;
return _Name;
}
}
string _Name;
тогда при вызове вот такого кода мы будет падать по NullException-у с вероятностью 50%:
Здравствуйте, stalcer, Вы писали: S>А при чем здесь исключения. null есть только для ссылочных типов. А, например, возмем структуру Address. Пусть адрес может быть не задан по условию задачи. И что?
Nullable<Address>. И все.
Оператор .? работает только на ссылочных типах и на value типах реализующих INullable. Попытка применить его к Address вызовет compile-time error.
... << RSDN@Home 1.1.4 stable rev. 510>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Nullable<Address>. И все. S>Оператор .? работает только на ссылочных типах и на value типах реализующих INullable. Попытка применить его к Address вызовет compile-time error.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Cyberax, Вы писали:
C>>Неужели вы стали фанатом С++???!!!!
VD>Я уже пережил эту стадию... лет 5 назад.
Известная история. Тот, кто недавно отрубал головы драконам, сейчас сам им стал.
Здравствуйте, VladD2, Вы писали:
VD>Я думаю, синтаксис лямбд уже не изменится. Хорошо бы чтобы анонимные типы стали полноценными tuple-ами (т.е. типами которые можно сравнивать при совпадении структуры).
Tuple возможны на рантайме .NET2
Что то типа такого
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class RefTuple<T, U>
{
public T First;
public U Second;
public override string ToString()
{
return"{" + First.ToString() + ";" + Second.ToString() + "}";
}
public override bool Equals(object obj)
{
RefTuple<T, U> that = obj as RefTuple<T, U>;
if (that == null)
return false;
return Equals(this, that);
}
public override int GetHashCode()
{
return First.GetHashCode() ^ Second.GetHashCode();
}
private static bool Equals(RefTuple<T, U> l, RefTuple<T, U> r)
{
return l.First.Equals(r.First) && l.Second.Equals(r.Second);
}
public static bool operator ==(RefTuple<T, U> l, RefTuple<T, U> r)
{
return Equals(l, r);
}
public static bool operator !=(RefTuple<T, U> l, RefTuple<T, U> r)
{
return !Equals(l, r);
}
}
struct ValueTuple<T, U>
{
public T First;
public U Second;
public override int GetHashCode()
{
return First.GetHashCode() ^ Second.GetHashCode();
}
public override string ToString()
{
return First.ToString() + ";" + Second.ToString();
}
}
class Program
{
static RefTuple<int, ValueTuple<float, ValueTuple<float, string>>> Test()
{
RefTuple<int, ValueTuple<float, ValueTuple<float, string>>> t = new RefTuple<int, ValueTuple<float, ValueTuple<float, string>>>();
t.First = 1;
t.Second.First = 1.1f;
t.Second.Second.First = 123;
t.Second.Second.Second = "asdf";
return t;
}
static void Main()
{
RefTuple<int, ValueTuple<float, ValueTuple<float, string>>> t1 = Test();
RefTuple<int, ValueTuple<float, ValueTuple<float, string>>> t2 = Test();
// t1.Second.First = 1;
Console.WriteLine(t1 == t2);
Console.WriteLine(t1);
Console.WriteLine(t2);
}
}
}
Осталось прикрутить синтаксический сахар както так:
Кстати, любопытно, что в LINQ Preview, в Query.dll вводится атрибут System.Runtime.CompilerServices.ExtensionAttribute, который прицеплен ко всем операциям над последовательностями (класс System.Query.Sequence). Кажется именно это и является для комплятора признаком метода-расширения.
Здравствуйте, Дарней, Вы писали:
Д>Здравствуйте, DarkGray, Вы писали:
DG>>До сих пор не хватает "красивой" работы с нулевыми значениями
Д>А может быть, вместо null надо использовать специальный "нулевой" объект для каждого типа? Например, для массивов он будет возвращать Count = 0
В Net стараются внедрять статическое свойство empty
... << RSDN@Home 1.1.4 stable rev. 510>>
и солнце б утром не вставало, когда бы не было меня
AVK>А возможности подключения реализаций опять нет
Разговаривал сегодня на эту тему с Хейлсбергом. Итог таков — они много думали про подобное, но посчитали что это слишком тяжело для восприятия, посему ничего в таком направлении не сделали и перспектив на ближайшее будущее никаких.
Здравствуйте, AndrewVK, Вы писали:
AVK>Вышел первый прообраз спецификации.
Жаль... Задумка была хорошей, но похоже обречена....
Вся команда ObjectSpaces перешла в LINQ.
Здравствуйте, AndrewVK, Вы писали:
AVK>Разговаривал сегодня на эту тему с Хейлсбергом. Итог таков — они много думали про подобное, но посчитали что это слишком тяжело для восприятия, посему ничего в таком направлении не сделали и перспектив на ближайшее будущее никаких.
А ты ему не додумался дать в качестве идеи Скалу?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, DarkGray, Вы писали:
VD>> Будет у тебя нал-объект попадать во второй диапазон. Что страшного?
DG>страшно то, что результат должен был быть не такой.
DG>если это было бизнес-правило, например, для интернет-магазина: DG>Если возвраст < 10, то показать рекламу детских игрушек.
DG>то пользователях, которые не указали возраст будет показывать не интересная им реклама, что для интернет магазина означает недополучение прибыли.
DG>И это ты называешь не страшно?
А на самом деле, что должно показываться таким пользователям?
Третий вид рекламы?
if (user.Age > 21)
{
//bla-bla
}
if (user.Age < 16 && user.Age > 0)
{
//bla-bla
}
Реклама для взрослых?
Тогда дефолтное значение можно взять заведомо большое, типа int.MaxValue.
ie>А на самом деле, что должно показываться таким пользователям? ie>Третий вид рекламы? ie>Реклама для взрослых?
Может быть ничего, может какая-то другая реклама, может еще что-то.
В том-то и дело, что я не хочу об этом думать, когда пишу вышеперечисленные правила, я хочу иметь атомарность при внесении новых правил, изменении старых и т.д..
Если же я завожу какие-то NullObject-ы, default-ные MinValue, MaxValue — то у меня эта атомарность пропадает.
Вышеперечисленные правила, вообще, могут собираться из разных источников — их может быть даже заводят разные люди (причем может быть даже не совсем программисты).
И поэтому, в общем, случае мы, вообще, не знаем какие у нас есть правила, и какой NullObject (default-value) лучше всего подсунуть каждому правилу, или сразу всем правилам.
ie>Тогда дефолтное значение можно взять заведомо большое, типа int.MaxValue.
Чтобы сделать такое предположение, я должен иметь полное представление о том, какие правила у меня есть сейчас, будут завтра.
А зачем мне тратить свое время на то, чтобы такое знание получить?