Сообщение Re[6]: using UsingAlias<T>=NameSpace2.MyClass<T> от 16.02.2021 19:53
Изменено 16.02.2021 20:21 Silver_S
Re[6]: using UsingAlias<T>=NameSpace2.MyClass<T>
Здравствуйте, Ночной Смотрящий, Вы писали:
НС> Оттуда есть ссылка на документ — https://docs.microsoft.com/en-us/archive/blogs/csharpfaq/why-doesnt-c-have-vb-nets-with-operator
Там единственный разумный аргумент — то что это можно сделать на лямбдах с существующими фичами. Но это оверхед, и синтаксический и вычислительный, и initonly property так не инициализировать.
А в остальном, против те, кто собрались не по назначению применять.
— Это во-первых нужно в контексте, где только выражения. Например, если в инициализаторе элемента массива надо вставить произвольный код, или просто присвоить обработчик события.
— Во-вторых для работы с древовидными структурами. Чтобы не пришлось сериализовать дерево в кучу запутанных промежуточных переменных(еще и заморачиваясь с обходом — снизу вверх или сверху вниз).
Можно было бы просто
Синтаксисов для with можно придумать много. Здесь вариант без ключевых слов, просто с другими скобками "{{", типа инициализатора: Expr{{ .Property1 = 1;}}
НС> Оттуда есть ссылка на документ — https://docs.microsoft.com/en-us/archive/blogs/csharpfaq/why-doesnt-c-have-vb-nets-with-operator
Там единственный разумный аргумент — то что это можно сделать на лямбдах с существующими фичами. Но это оверхед, и синтаксический и вычислительный, и initonly property так не инициализировать.
Expr.With(x =>
{
x.Property1 = 1;
});
А в остальном, против те, кто собрались не по назначению применять.
— Это во-первых нужно в контексте, где только выражения. Например, если в инициализаторе элемента массива надо вставить произвольный код, или просто присвоить обработчик события.
— Во-вторых для работы с древовидными структурами. Чтобы не пришлось сериализовать дерево в кучу запутанных промежуточных переменных(еще и заморачиваясь с обходом — снизу вверх или сверху вниз).
Можно было бы просто
Expr with x{ x.Property1 = 1; }
вместо существующего Expr.With( x => { x.Property1 = 1; });
Синтаксисов для with можно придумать много. Здесь вариант без ключевых слов, просто с другими скобками "{{", типа инициализатора: Expr{{ .Property1 = 1;}}
var outerVar = 3;
var lst = new List<C>()
{
new C{InitOnlyProperty1 = 1},
new C{InitOnlyProperty1 = 2},
new C()
{{
if(outerVar < 10) {} //can have any code as in the normal block
.InitOnlyProperty1 = outerVar; // If the expression before the block is the constructor (without initializer) it is allowed to modify "initonly"
}},
new C{InitOnlyProperty1 = 4},
};
var v1 = 1;
objLevel1.objLevel2.objLevel3
{{
.Member1 = v1;
.Member2 = v1;
for(i=0;i<v1;i++) {} //can have any code as in the normal block
.objLevel4
{{
.Member1 = v1;
.Member2 = v1;
.objLevel5
{{
.Member20 = 1;
//...
}};
.obj2Level5 = new Cl(){{ .Member = 10;}};
}};
.Member20 = v1;
}};
Re[6]: using UsingAlias<T>=NameSpace2.MyClass<T>
Здравствуйте, Ночной Смотрящий, Вы писали:
НС> Оттуда есть ссылка на документ — https://docs.microsoft.com/en-us/archive/blogs/csharpfaq/why-doesnt-c-have-vb-nets-with-operator
Там единственный разумный аргумент против — то что это можно сделать на лямбдах с существующими фичами. Но это оверхед, и синтаксический и вычислительный, и initonly property так не инициализировать.
А в остальном, против те, кто собрались не по назначению применять.
— Это во-первых нужно в контексте, где только выражения. Например, если в инициализаторе элемента массива надо вставить произвольный код, или просто присвоить обработчик события.
— Во-вторых для работы с древовидными структурами. Чтобы не пришлось сериализовать дерево в кучу запутанных промежуточных переменных(еще и заморачиваясь с обходом — снизу вверх или сверху вниз).
Можно было бы просто
Синтаксисов для with можно придумать много. Здесь вариант без ключевых слов, просто с другими скобками "{{", типа инициализатора: Expr{{ .Property1 = 1;}}
НС> Оттуда есть ссылка на документ — https://docs.microsoft.com/en-us/archive/blogs/csharpfaq/why-doesnt-c-have-vb-nets-with-operator
Там единственный разумный аргумент против — то что это можно сделать на лямбдах с существующими фичами. Но это оверхед, и синтаксический и вычислительный, и initonly property так не инициализировать.
Expr.With(x =>
{
x.Property1 = 1;
});
А в остальном, против те, кто собрались не по назначению применять.
— Это во-первых нужно в контексте, где только выражения. Например, если в инициализаторе элемента массива надо вставить произвольный код, или просто присвоить обработчик события.
— Во-вторых для работы с древовидными структурами. Чтобы не пришлось сериализовать дерево в кучу запутанных промежуточных переменных(еще и заморачиваясь с обходом — снизу вверх или сверху вниз).
Можно было бы просто
Expr with x{ x.Property1 = 1; }
вместо существующего Expr.With( x => { x.Property1 = 1; });
Синтаксисов для with можно придумать много. Здесь вариант без ключевых слов, просто с другими скобками "{{", типа инициализатора: Expr{{ .Property1 = 1;}}
var outerVar = 3;
var lst = new List<C>()
{
new C{InitOnlyProperty1 = 1},
new C{InitOnlyProperty1 = 2},
new C()
{{
if(outerVar < 10) {} //can have any code as in the normal block
.InitOnlyProperty1 = outerVar; // If the expression before the block is the constructor (without initializer) it is allowed to modify "initonly"
}},
new C{InitOnlyProperty1 = 4},
};
var v1 = 1;
objLevel1.objLevel2.objLevel3
{{
.Member1 = v1;
.Member2 = v1;
for(i=0;i<v1;i++) {} //can have any code as in the normal block
.objLevel4
{{
.Member1 = v1;
.Member2 = v1;
.objLevel5
{{
.Member20 = 1;
//...
}};
.obj2Level5 = new Cl(){{ .Member = 10;}};
}};
.Member20 = v1;
}};