int a=1000;
printf("%d",printf("\n%d",a));
В этом фрагменте кода есть 2 функции printf ():
Сначала выполнится внутренняя функция printf () и напечатает 1000
, а затем выполнится внешняя функция printf ().
Следует отметить, что printf()
возвращает число символов, которые он печатает и , escape-последовательности подсчитываются как символ в printf ().
Таким образом, выполняя внутреннюю функцию printf (), мы получили 5 (потому что '\ n', 1, 0, 0, 0 - 5 символов) Теперь, когда выполняется внешняя функция printf (), 5 напечатано.
Это новая функция C # 3.0, которая называется метод расширения .
Это означает, что вы добавляете новый метод к своим объектам ModelStateDictionary. Вы можете вызвать его как обычный метод:
yourModelStateDictionary.AddRuleViolations( errors );
Видите, что первый параметр (параметр this) пропускается. Он назначает только ModelStateDictionary в качестве допустимой цели для вашего метода расширения.
Подсказка состоит в том, что вы можете сделать это с любым классом - даже с запечатанными или сторонними классами, такими как классы .Net framework (например, для объекта или строки).
Это сигнатура метода расширения, это означает "AddRuleViolations" будет рассматриваться как метод расширения ModelStateDictionary.
Из MSDN.
Методы расширения позволяют «добавлять» методы для существующих типов без создание нового производного типа, перекомпиляция или иное изменение исходный тип. Методы расширения особый вид статического метода, но их называют так, как если бы они были методы экземпляра для расширенного типа. Для клиентского кода, написанного на C # и Visual Basic, очевидного нет разница между вызовом метод расширения и методы, которые фактически определены в типе.
Это означает, что рассматриваемый метод является «методом расширения» и может быть вызван, как если бы он был методом самого класса. См. Эту статью .
Также см. Здесь: Методы расширения (Руководство по программированию C #)