Задать вопрос

Анонимные типы в c# и их особенности?

Всем привет. Начал изучать анонимные типы в c#.
Автор приводит пример синтаксиса Анонимного типаvar instance=new{Name"Alex", Age=27}; и предлагает последовательно - шаг за шагом добавить на эту строку дополнительные элементы синтаксиса - что бы данная строк стала более узнаваемая "читаемая" для нас (напоминаю- автор это делает т.к пример и весь курс - учебный) т.е превратив выше приведенную строку в
var instance=new MyClass(){Name"Alex", Age=27};
- говоря, что мы добавили имя конструктора по умолчанию и круглые скобки для приема аргументов конструктора, и тут же демонстрируеь, что добавляя это - студия предлагает сгенерировать нам свойства для Age и для Name в классе MyClass(класс он создал сам-опять же для примера, но сказал, что в анонимных типах при генерации свойств класс такжн создаетс автоматически)
В классе сгенерировались авто-реализуемые свойства
ef71d538433c426884fce02c86587823.jpg
- но автор сказал, что они должны быть только для чтения -т.е в (ну в данномслучае посто нужно убрать set - ведь студия генерировала свойства как для обычных полей класса когда мы дописала имя конструктора по умолчаню после ключевого слова new) .
И это подводит меня к вопросу №3(вопросы №1 и 2 представлены ниже) Если авто генерируемые , авто-реализуемые свойства в также автоматически созданном классе(назовем его MyClass) -только для чтения, то каким образом в блоке инициализатора на строке var instance=new{Name"Alex", Age=27}; - мы вообще можем присваивать этим полям значения ?
Вот скриншот первого примера, в котором меня интересует комментарий: - в котором у меня и возникают все эти вопросы.
579d891c91b74ba5bc63419666ce4c1a.png

вопрсос №1 т.е компилятор каждый раз создает новое имя для анонимного типа, который в свою очередь является ссылочным типом ?
вопрос№2 т.е приложение не может обращаться ссылке(т.к тип ссылочный) к новому имени созданному
Далее автор говорит, что компилятором.
Вопрос№3 - представлен вначале.
  • Вопрос задан
  • 2646 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
@none7
Этот автор только сильно запутал Вас. Код:
var instance = new {Name = "Alex", Age = 27}
Эквивалентен такому коду:
class Anonymous0001 // ссылочный тип
{
    public string Name { get; private set; } // из других классов выглядит как read-only свойство
    public int Age { get; private set; }
    public Anonymous0001(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main()
    {
        var instance = new Anonymous0001("Alex", 27);
    }
}

Если будет другая строка new { ... }, то компилятор сгенерирует ещё один класс. Всю остальную ересь просто забудьте. В анонимный тип нельзя добавить какую либо функциональность и от них нет никакого толку. Созданы лишь как часть синтаксического сахара, для упрощения выборки нескольких значений из linq запросов. Вроде такого:
var a = new System.Collections.Generic.Dictionary<string, int>() { { "vasya", 0 }, { "kolya", 0 }, { "alex", 1} };

int i = 0;
var result = from item in a where item.Value == 0
    select new { Index = i++, Name = item.Key, Id = item.Value }; // создание объекта анонимного типа

foreach(var res in result) {
    bool first = true;
    foreach (var prop in res.GetType().GetProperties()) {
        if (first) first = false;
        else Console.Write(", ");
        Console.Write("{0} = {1}", prop.Name, prop.GetValue(res, null));
    }
    Console.WriteLine();
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы