Недостатки использования анонимных типов вместо словарей? - PullRequest
4 голосов
/ 27 сентября 2010

Я написал эту функцию

    private string BuildXPathQuery(string prefix = "descendant::", string tag = "*", object attrs = null)
    {
        StringBuilder sb = new StringBuilder(prefix);
        sb.Append(tag);
        if (attrs != null)
            foreach (var a in attrs.GetType().GetProperties())
                sb.Append(string.Format("[@{0}='{1}']", a.Name, a.GetValue(attrs, null)));
        return sb.ToString();
    }

Чтобы вместо записи

 BuildXPathQuery(attrs: new Dictionary<string,string> {{"attr","value"}});

я мог написать

BuildXPathQuery(attrs: new {attr=value});

Но есть ли у этого недостатки?

Ответы [ 2 ]

4 голосов
/ 27 сентября 2010

Используется отражение, которое может быть медленнее, чем обычный тип доступа. Другим недостатком является то, что при просмотре сигнатуры метода вы видите объект и для конечного потребителя этого метода не всегда может быть очевидно, что он должен поместить туда, потому что объект может быть буквально чем угодно:

Когда Intellisense показывает:

BuildXPathQuery(object attrs);

Вы действительно должны догадаться здесь, если это не очень хорошо документировано (например, HTML-помощники ASP.NET MVC используют аналогичный подход для построения атрибутов HTML на элементах DOM).

Это такой подход Rubyist, который мне нравится :-) (необязательные аргументы и хеш-таблицы)

0 голосов
/ 27 сентября 2010

Я думаю, что анонимные типы - это круто, и вы можете легко привести их к соответствующему объекту на основе объекта, который вы отправляете.

Вы можете использовать этот анонимный тип для метода, а также использовать его для отражения.Вы также можете попытаться привести объект к типу, если хотите, используя:

var x = attrs as new{x="", y=""};

Следует отметить, что компилятор достаточно умен, чтобы использовать существующий анонимный тип, а не создавать новый тип для приведения.

http://www.west -wind.com / weblog / posts / 189329.aspx

Как уже говорилось, анонимные типы работают медленнее, поэтому я вижу только одну проблему:медленная производительность.Но аноним выглядит круто для меня.

...