[C# 3.0] Цепочка вызовов свойств и промежуточные null-ы

6yrop

тут как-то писал о том, что неплохо бы иметь в языке возможность писать выражения
a.B.C.Name;  

не проверяя каждый раз промежуточные объекты на null.
На мой взгляд, в C# 3.0 это выглядит уже вполне сносно :)

using System;

namespace Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
new A.B.Get(x=>x.B001)
);
Console.WriteLine(
new A.B.Get(x=>x.C.Get(x2=>x2.C001
);
}

}

public class A
{
public B B
{
get
{
return new B;
}
}
}

public class B
{
public string B001
{
get
{
return "трам пам пам";
}
}

public C C
{
get
{
return new C;
}
}
}

public class C
{
public int C001
{
get
{
return 123;
}
}
}


public delegate T2 Getter<T, T2>(T t);

public static class Util
{
public static T2 Get<T, T2>(this T t, Getter<T, T2> getter)
{
if (t == null)
{
if (typeof(int).Equals(typeof(T2
{
object result = int.MinValue;
return (T2)result;
}
else
{
return default(T2);
}
}
else
{
return getter(t);
}
}
}
}

P.S. VS пока не ставил, набирал в блокноте и компилировал из командной строки

Dasar

Console.WriteLine(
new A.B.Get(x=>x.C.Get(x2=>x2.C001
);
Плохо, что получается скобочная запись, т.е. плохо, что у нас все закрывающие скобки скапливаются в самом конце выражения. потом в этих скобках черт ногу сломит.
лучше так:
new A.B.Get(x=>x.C).Get(x=>x.C001)
для valuetype-ов лучше добавить:

public static T2? GetOrNull<T, T2>(this T t, Getter<T, T2> getter)
{
if (t == null)
return null;
return getter(t);
}

6yrop

new A.B.Get(x=>x.C).Get(x=>x.C001)
о спасибо :), это совсем хорошо :)
(вчера ночью тоже подумал о таком, но показалось, что будет вызов метода у null-а, а оказалось все проще :))

Alexander08

Плохо, что получается скобочная запись, т.е. плохо, что у нас все закрывающие скобки скапливаются в самом конце выражения. потом в этих скобках черт ногу сломит.
ниче плохого не вижу. подсветку синтаксиса(и скобок в том числе) трусы придумали?

6yrop

ниче плохого не вижу. подсветку синтаксиса(и скобок в том числе) трусы придумали?
да что спорить плохо или нет, это просто не нужно :), все так же работает и для записи -я :). В той записи еще надо было переменные по разному обзывать x, x2, ...

Dasar

> ниче плохого не вижу. подсветку синтаксиса(и скобок в том числе) трусы придумали?
если ты считаешь, что время у разработчика бесплатное, то ничего плохо конечно нет.
проблема в том, что даже если есть подсветка синтаксиса - то для того, чтобы понять где скобка начинается, а где заканчивается - нужно к каждой скобке мышку подвести.
не зря же в той же математической нотации, или в тех же конвейерах в C++: старались по максимуму убрать скобки на однотипных операциях.
зы
когда в коде написано что-нибудь такое:
Round(Mul(GetRange(items, 2 options.GetK(1 3)
хрен сходу поймешь, к какой именно функции все эти константы 2, 1, 3 - подходят.
запись того же самого в виде конвейера намного нагляднее
GetRange(items,2)
.Mul(options.GetK(1
.Round(3)
Оставить комментарий
Имя или ник:
Комментарий: