DefaultMemberAttribute - что он делает? - PullRequest
9 голосов
/ 13 июля 2009

Я уже читал об этом статью в MSDN. Внутренне кажется, что именно так c # устанавливает, какая функция будет работать в качестве индексатора (я прав?). Теперь я видел следующий пример:

[DefaultMemberAttribute("Main")]
public class Program {

    public static void Main() {
        ...
    }
}

Теперь я не понимаю, что это значит.


Спасибо всем. Но я все еще не могу получить его полезность, кроме предмета индексатора. Когда мы собираемся позвонить InvokeMember?

Ответы [ 3 ]

10 голосов
/ 13 июля 2009

Нет, DefaultMemberAttribute используется такими языками, как VB.NET, чтобы выяснить, к какому члену обращаются по умолчанию, если на объект не ссылаются, то есть член, вызванный InvokeMember. Как вы заметили, это часто используется вместе с индексаторами, но не используется C # напрямую (если вы явно не используете InvokeMember).

Тем не менее, в интересах других языков .NET, C # выдает DefaultMemberAttribute для индексатора класса (если он есть), как указано MSDN :

Компилятор C # выдает DefaultMemberAttribute для любого типа содержащий индексатор. В C # это ошибка для ручного определения типа с атрибутом DefaultMemberAttribute, если Тип также объявляет индексатор.

Я думаю, что MSDN вводит в заблуждение, часто ссылаясь на индексаторы в комментариях, но затем приводит пример, который не использует индексатор. Чтобы уточнить, членом по умолчанию может быть что угодно, но C # предоставляет специальное поведение для индексаторов, передавая вам атрибут (если индексатор существует), за исключением всех других случаев использования.

6 голосов
/ 13 июля 2009

Лично я никогда не использовал его, но, насколько я могу судить, вы определяете метод по умолчанию, который будет вызываться при вызове InvokeMember . Итак, используя фрагмент кода, который вы предоставили, если бы я сказал:

Program prog = new Program();
typeof(Program).InvokeMember("", null, null, prog, null);

Поскольку я оставил первый аргумент пустым при вызове InvokeMember, он будет использовать атрибут, чтобы определить, какой элемент по умолчанию принадлежит вашему классу, в вашем случае это Main.

1 голос
/ 13 июля 2009

Атрибут DefaultMemberAttribute определяет элемент по умолчанию, который вызывается при вызове InvokeMember с пустой строкой в ​​качестве первого аргумента.

Если вы читаете документы MSDN для InvokeMember , в нем явно говорится:

Параметры
имя
Тип: System.String
Строка, содержащая имя конструктора, метода, свойства или члена поля для вызова.
-или-
Пустая строка ("") для вызова члена по умолчанию.

Членом по умолчанию будет член, объявленный атрибутом DefaultMemberAttribute.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...