Информация об изменениях

Сообщение Re[6]: using UsingAlias<T>=NameSpace2.MyClass<T> от 16.02.2021 19:53

Изменено 16.02.2021 20:14 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 так не инициализировать.

Expr.With(x =>
    {
        x.Property1 = 1;        
    });


А в остальном, против те, кто собрались не по назначению применять.

— Это во-первых нужно в контексте, где только выражения. Например, если в инициализаторе элемента массива надо вставить произвольный код, или просто присвоить обработчик события.
— Во-вторых для работы с древовидными структурами. Чтобы не пришлось сериализовать дерево в кучу запутанных промежуточных переменных(еще и заморачиваясь с обходом — снизу вверх или сверху вниз).


Можно было бы просто
Expr with x{ x.Property1 = 1; }
вместо существующего
Expr.With( x => { x.Property1 = 1; });

Синтаксисов для with можно придумать много. Здесь вариант без ключевых слов, просто с другими скобками "{{", типа инициализатора. Без переменной — только с точкой.


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 так не инициализировать.

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;
}};