Re[8]: С# 3.0
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 19.09.05 07:27
Оценка:
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%:
if (user != null && user.Name != null && user.Name.Length > 10)


поэтому код
if (user.?Name.?Length > 10)

должен преобразовываться в (чтобы исключить повторные вызовы)
int? length = null;
if (user != null)
{
  string name = user.Name;
  if (name != null)
    length = name.Length;
}
if (length > 10)
Re[8]: С# 3.0
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.09.05 08:52
Оценка:
Здравствуйте, stalcer, Вы писали:
S>А при чем здесь исключения. null есть только для ссылочных типов. А, например, возмем структуру Address. Пусть адрес может быть не задан по условию задачи. И что?
Nullable<Address>. И все.
Оператор .? работает только на ссылочных типах и на value типах реализующих INullable. Попытка применить его к Address вызовет compile-time error.
... << RSDN@Home 1.1.4 stable rev. 510>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: С# 3.0
От: stalcer Россия  
Дата: 19.09.05 09:02
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>поэтому код

DG>
DG>if (user.?Name.?Length > 10)
DG>

DG>должен преобразовываться в (чтобы исключить повторные вызовы)
DG>
DG>int? length = null;
DG>if (user != null)
DG>{
DG>  string name = user.Name;
DG>  if (name != null)
DG>    length = name.Length;
DG>}
DG>if (length > 10)
DG>


Да, конечно. Так же примерно работают индексеры:

foo[bar.getIndex()] += 7;


getIndex() будет вызван один раз, хотя для индексера будут вызваны и get и set.
http://www.lmdinnovative.com (LMD Design Pack)
Re[9]: С# 3.0
От: stalcer Россия  
Дата: 19.09.05 09:02
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Nullable<Address>. И все.

S>Оператор .? работает только на ссылочных типах и на value типах реализующих INullable. Попытка применить его к Address вызовет compile-time error.

Дык, я как раз это и пытался еловеку объяснить .
http://www.lmdinnovative.com (LMD Design Pack)
Re[12]: С# 3.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.09.05 11:21
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Неужели вы стали фанатом С++???!!!!


Я уже пережил эту стадию... лет 5 назад.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: С# 3.0
От: alexeiz  
Дата: 20.09.05 02:34
Оценка:
Здравствуйте, VladD2, Вы писали:

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


C>>Неужели вы стали фанатом С++???!!!!


VD>Я уже пережил эту стадию... лет 5 назад.


Известная история. Тот, кто недавно отрубал головы драконам, сейчас сам им стал.
Re[14]: С# 3.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.09.05 13:09
Оценка: :)
Здравствуйте, alexeiz, Вы писали:

A>Известная история. Тот, кто недавно отрубал головы драконам, сейчас сам им стал.


Не, я стал слоником.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Офтоп
От: McSeem2 США http://www.antigrain.com
Дата: 20.09.05 23:40
Оценка: 1 (1) +1 :))


Счасливое число в оценках! Мои поздравления!
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[9]: С# 3.0
От: WolfHound  
Дата: 23.09.05 07:21
Оценка:
Здравствуйте, 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);
        }
    }
}

Осталось прикрутить синтаксический сахар както так:
    class Program
    {
        static {int, float, float, string} Test()
        {
            return {1, 1.1f, 123f, "asdf"};
        }

        static void Main()
        {
            {int, float, float, string} t1 = Test();
            {int, float x, float, string} t2 = Test();
//            x = 1;
            Console.WriteLine(t1 == t2);
            Console.WriteLine(t1);
            Console.WriteLine(t2);
        }
    }
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: С# 3.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.05 02:27
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Осталось прикрутить синтаксический сахар както так:

WH>
WH>    class Program
WH>    {
WH>        static {int, float, float, string} Test()
WH>        {
WH>            return {1, 1.1f, 123f, "asdf"};
WH>        }

WH>        static void Main()
WH>        {
WH>            {int, float, float, string} t1 = Test();
WH>            {int, float x, float, string} t2 = Test();
WH>//            x = 1;
WH>            Console.WriteLine(t1 == t2);
WH>            Console.WriteLine(t1);
WH>            Console.WriteLine(t2);
WH>        }
WH>    }
WH>


Во-во. Осталось начать и кончить.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: С# 3.0
От: Igor Trofimov  
Дата: 25.09.05 17:31
Оценка:
VD>
VD>    public static T Parse<T>(this string str)
VD>


Да, тоже вариент...
Re[8]: С# 3.0
От: Igor Trofimov  
Дата: 25.09.05 17:54
Оценка:
Кстати, любопытно, что в LINQ Preview, в Query.dll вводится атрибут System.Runtime.CompilerServices.ExtensionAttribute, который прицеплен ко всем операциям над последовательностями (класс System.Query.Sequence). Кажется именно это и является для комплятора признаком метода-расширения.
Re[2]: С# 3.0
От: Дарней Россия  
Дата: 28.09.05 11:56
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>До сих пор не хватает "красивой" работы с нулевыми значениями


А может быть, вместо null надо использовать специальный "нулевой" объект для каждого типа? Например, для массивов он будет возвращать Count = 0
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[3]: С# 3.0
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.09.05 12:18
Оценка:
Здравствуйте, Дарней, Вы писали:

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


DG>>До сих пор не хватает "красивой" работы с нулевыми значениями


Д>А может быть, вместо null надо использовать специальный "нулевой" объект для каждого типа? Например, для массивов он будет возвращать Count = 0

В Net стараются внедрять статическое свойство empty
... << RSDN@Home 1.1.4 stable rev. 510>>
и солнце б утром не вставало, когда бы не было меня
Re[2]: С# 3.0
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 01.10.05 01:12
Оценка:
AVK>А возможности подключения реализаций опять нет

Разговаривал сегодня на эту тему с Хейлсбергом. Итог таков — они много думали про подобное, но посчитали что это слишком тяжело для восприятия, посему ничего в таком направлении не сделали и перспектив на ближайшее будущее никаких.

P.S. Слева направо: Хейлсберг, я.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re: С# 3.0
От: Merle Австрия http://rsdn.ru
Дата: 01.10.05 13:31
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Вышел первый прообраз спецификации.

Жаль... Задумка была хорошей, но похоже обречена....
Вся команда ObjectSpaces перешла в LINQ.
... << RSDN@Home 1.1.4 beta 6a rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[3]: С# 3.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.10.05 01:37
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Разговаривал сегодня на эту тему с Хейлсбергом. Итог таков — они много думали про подобное, но посчитали что это слишком тяжело для восприятия, посему ничего в таком направлении не сделали и перспектив на ближайшее будущее никаких.


А ты ему не додумался дать в качестве идеи Скалу?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: С# 3.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.10.05 01:39
Оценка:
Здравствуйте, Merle, Вы писали:

M>Жаль... Задумка была хорошей, но похоже обречена....

M>Вся команда ObjectSpaces перешла в LINQ.

Вы бы им там сказали, что писат select в конце запросы — это по меньше мере странно (это я про квари компрехэншон).
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: С# 3.0
От: ie Россия http://ziez.blogspot.com/
Дата: 03.10.05 02:40
Оценка: +1
Здравствуйте, 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.
Превратим окружающую нас среду в воскресенье.
Re[9]: С# 3.0
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 03.10.05 07:45
Оценка:
ie>А на самом деле, что должно показываться таким пользователям?
ie>Третий вид рекламы?
ie>Реклама для взрослых?

Может быть ничего, может какая-то другая реклама, может еще что-то.

В том-то и дело, что я не хочу об этом думать, когда пишу вышеперечисленные правила, я хочу иметь атомарность при внесении новых правил, изменении старых и т.д..
Если же я завожу какие-то NullObject-ы, default-ные MinValue, MaxValue — то у меня эта атомарность пропадает.

Вышеперечисленные правила, вообще, могут собираться из разных источников — их может быть даже заводят разные люди (причем может быть даже не совсем программисты).
И поэтому, в общем, случае мы, вообще, не знаем какие у нас есть правила, и какой NullObject (default-value) лучше всего подсунуть каждому правилу, или сразу всем правилам.



ie>Тогда дефолтное значение можно взять заведомо большое, типа int.MaxValue.


Чтобы сделать такое предположение, я должен иметь полное представление о том, какие правила у меня есть сейчас, будут завтра.
А зачем мне тратить свое время на то, чтобы такое знание получить?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.