Инициализация членов класса перед выполнением конструктора
От: Svoyak  
Дата: 09.08.13 07:17
Оценка: +1
Добрый! Подскажите пжалуста есть ли в c# возможность инициализировать члены класса ПЕРЕД выполнением конструктора при помощи списка инициализации. Например при помощи вот такого синтаксиса
свойства инициализируются ПОСЛЕ выполнения тела конструктора, а хотелось бы как в ++ перед конструктором. Может есть другие варианты? На SO есть такой вопрос, но там ответили, что нет мол, так не получится.( Что подскажете?? Спасибо.
        public class A1
        {
            public A1(string somedata){//некоторые действия}
            public string Prop1{get;set;}
            public string Prop2{get;set;}
        }
// гдето вызов 
        A1 a = new A1(stringvar){ Prop1 = "Vasya", Prop2 = "Petya"};
Re: Инициализация членов класса перед выполнением конструктора
От: Nikolay_Ch Россия  
Дата: 09.08.13 07:28
Оценка:
Здравствуйте, Svoyak, Вы писали:

S>Добрый! Подскажите пжалуста есть ли в c# возможность инициализировать члены класса ПЕРЕД выполнением конструктора при помощи списка инициализации. Например при помощи вот такого синтаксиса

S>свойства инициализируются ПОСЛЕ выполнения тела конструктора, а хотелось бы как в ++ перед конструктором. Может есть другие варианты? На SO есть такой вопрос, но там ответили, что нет мол, так не получится.( Что подскажете?? Спасибо.
S>
S>        public class A1
S>        {
S>            public A1(string somedata){//некоторые действия}
S>            public string Prop1{get;set;}
S>            public string Prop2{get;set;}
S>        }
S>// гдето вызов 
S>        A1 a = new A1(stringvar){ Prop1 = "Vasya", Prop2 = "Petya"};

S>

А зачем это надо?
Re: Инициализация членов класса перед выполнением конструктора
От: cvetkov  
Дата: 09.08.13 07:39
Оценка: +1
Здравствуйте, Svoyak, Вы писали:

S> На SO есть такой вопрос, но там ответили, что нет мол, так не получится.( Что подскажете?? Спасибо.

правду там сказали.
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re: Инициализация членов класса перед выполнением конструктора
От: SimpleQuestion  
Дата: 09.08.13 08:03
Оценка:
Если принять во внимание, что инициализатор объекта это синтаксический сахар, а
Point a = new Point { X = 0, Y = 1 };
эквивалентно
Point __a = new Point();
__a.X = 0;
__a.Y = 1; 
Point a = __a;
То сразу становится ясно, почему так нельзя.
Re: Инициализация членов класса перед выполнением конструктора
От: -n1l-  
Дата: 09.08.13 08:31
Оценка:
Здравствуйте, Svoyak, Вы писали:

S>Добрый! Подскажите пжалуста есть ли в c# возможность инициализировать члены класса ПЕРЕД выполнением конструктора при помощи списка инициализации. Например при помощи вот такого синтаксиса

S>свойства инициализируются ПОСЛЕ выполнения тела конструктора, а хотелось бы как в ++ перед конструктором. Может есть другие варианты? На SO есть такой вопрос, но там ответили, что нет мол, так не получится.( Что подскажете?? Спасибо.
S>
S>        public class A1
S>        {
S>            public A1(string somedata){//некоторые действия}
S>            public string Prop1{get;set;}
S>            public string Prop2{get;set;}
S>        }
S>// гдето вызов 
S>        A1 a = new A1(stringvar){ Prop1 = "Vasya", Prop2 = "Petya"};

S>



Экземплярные нет, может быть статические подойдут?
Re: Инициализация членов класса перед выполнением конструктора
От: vorona  
Дата: 09.08.13 08:55
Оценка: 28 (5) +1
Здравствуйте, Svoyak, Вы писали:

using System;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;

namespace ConsoleApplication1
{
    class A
    {
        public A()
        {
            Console.WriteLine(PropertyA);
        }

        public string PropertyA { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IntPtr ctor = typeof(A).GetConstructor(new Type[0]).MethodHandle.GetFunctionPointer();
            var actionCtor = typeof(Action<Object>).GetConstructor(new Type[] { typeof(Object), typeof(IntPtr) });
            var ctorDelegate = (Action<Object>)actionCtor.Invoke(new Object[] { null, ctor });

            var a = (A)FormatterServices.GetUninitializedObject(typeof(A));
            a.PropertyA = "Hello word!";
            ctorDelegate(a);
        }
    }
}
Re: Инициализация членов класса перед выполнением конструктора
От: AngeL B. Россия  
Дата: 09.08.13 09:03
Оценка:
Здравствуйте, Svoyak, Вы писали:

S>Добрый! Подскажите пжалуста есть ли в c# возможность инициализировать члены класса ПЕРЕД выполнением конструктора при помощи списка инициализации. Например при помощи вот такого синтаксиса

S>свойства инициализируются ПОСЛЕ выполнения тела конструктора, а хотелось бы как в ++ перед конструктором. Может есть другие варианты? На SO есть такой вопрос, но там ответили, что нет мол, так не получится.( Что подскажете?? Спасибо.

В отличие от С++, где вызов операции "new Type()" можно представить как "new" + "obj.Type()", в C# конструктор (точнее среда .NET) создает объект сам. Поэтому выполнить какие-либо действия до вызова конструктора не представляется возможным, т.к. не существует самого объекта.

А почему не рассматривается вариант с параметризованными конструкторами?
Re: Инициализация членов класса перед выполнением конструктора
От: antigravity blog
Дата: 09.08.13 22:17
Оценка: +1
Здравствуйте, Svoyak, Вы писали:

S>свойства инициализируются ПОСЛЕ выполнения тела конструктора, а хотелось бы как в ++ перед конструктором. Может есть другие варианты? На SO есть такой вопрос, но там ответили, что нет мол, так не получится.( Что подскажете?? Спасибо.


Параметризованный конструктор вам в помощь.
Вынесите вашу магию из конструктора. И "проблема" исчезнет и коллеги не побъют за лапшу в .ctor.
Re: Инициализация членов класса перед выполнением конструктора
От: Sinatr Германия  
Дата: 12.08.13 08:06
Оценка:
Здравствуйте, Svoyak, Вы писали:

Как-то так
        public class A1
        {
            public A1(string somedata){//некоторые действия}
            public A1(string somedata, string prop1, string prop2){ Prop1 = prop1; Prop2 = prop2; //некоторые действия}
            public string Prop1{get;set;}
            public string Prop2{get;set;}
        }

        // гдето вызов 
        // A1 a = new A1(stringvar){ Prop1 = "Vasya", Prop2 = "Petya"};
        A1 a = new A1("Vasya", "Petya", stringvar);

"Некоторые действия" оформить в виде приватного метода, который вызывается из всех конструкторов. Ну или можно попробовать с одним конструктором, если использовать параметры с значениями по умолчанию, как-то так:
            public A1(string somedata, string prop1 = "", string prop2 = "Serega"){ Prop1 = prop1; Prop2 = prop2; //некоторые действия}
---
ПроГLамеры объединяйтесь..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.