Экзамен 70 483 programming in c

Время на прочтение
13 мин

Количество просмотров 102K


Во время подготовки к экзамену номер 70-483 нашел множество разрозненных сайтов с различными ссылками на мануалы, которые мне немного помогли. Но, что помогло мне больше, так это то, что я составил для себя памятку на нескольких страницах, выдержками из которой и хочу поделиться.
Целью не является подробное описание C#, целью является освежить в памяти и заострить внимание на некоторых необходимых темах. Если какие-то темы вам незнакомы, то это значит, что у вас есть пробелы, которые необходимо устранить.
Раскрывать вопросы тестирования я не могу (да и не помню я уже их), но, если многие из перечисленных ниже нюансов, трюков и тонкостей, помогут вам, то вы на меня не обижайтесь (написано с иронией).

Начнем с простых вещей, о которых часто забывают, но которые часто используют в тестах:
Для того, чтобы объявить переменную типа int, и присвоить ей сразу значение 0, можно сделать так: var myInt=0; или так int myInt=0;
Для того, чтобы объявить переменную типа int, и задать сразу ей значение по умолчанию, нужно сделать так: int myInt = new int();

Explicit and Implicit типизация

int i = 42; // это explicit типизация – указан тип переменной int
var i = 42;  // а это уже implicit типизация. Компилятор задает переменной тип исходя из ее значения.

Используйте implicit типизацию при:
Анонимных типах — var anonymousType = new { Name = «Alex» };
Получении результата запроса LINQ — var queryExpression = from c in customers where c.Name == «Andrey» select c;
Использовании complex generic типов — var searchList = new Dictionary();
Implicit типизация возможна только для локальных переменных.

Boxing/Unboxing
Boxing – это конвертация value типа в тип reference
Unboxing наоборот – конвертация reference типа в value. Для Unboxing-а необходим Cast.
Boxing/Unboxing копирует значение переменной.
Boxing с точки зрения скорости вычислений — операция занимающая довольно много процессорных ресурсов.
Простой пример:

int i = 123;
// Следующая строчка упаковывает переменную i (происходит boxing) 
object o = i;  // object – это тип reference тип, а int – это тип value
j = (int)o;  // unboxing – распаковка

Интересный пример ошибки:

double e = 2.718281828459045;
object o = e; // box
// int ee = (int)o; // вызовет runtime exception, так как o не может быть распознано как тип int
int ee = (int)(double)o; // сделает unboxing без ошибки

Еще пример:

int count=1;
object countObject=count; // значение count скопировано в переменную countObject – это boxing
count+=1; // count уже равен 2, а значение countObject все еще 1
count=(int)countObject; // теперь и count равно 1 – это был unboxing

Оператор ?? называется null-coalescing operator. Он возвращает левое значение, в случае, если оно не равно null, в ином случае правое значение. Пример:

int? x = null; // здесь int? означает что это Nullable type т.е. что можно объекту присвоить null
int y = x ?? -1; // В этом случае y равен -1 потому что x равен null

Оператор ?: называется conditional operator. Он возвращает одно из двух значений исходя из булева выражения. Если выражение равно true, то возвращается первое значение, в ином случае — второе. Для примера 2 аналогичных кода:

if (input<0)  // используя конструкцию if-else
    classify = "negative";
else
    classify = "positive";

classify = (input < 0) ? "negative" : "positive";  // используя conditional operator ?:

LINQ
Любой объект, который реализует интерфейс IEnumerable или IQueryable может быть запрошен используя LINQ.
Можно использовать как orderby … descending так и OrderByDescending
orderby h.State, h.City – здесь orderby пишется слитно, однако group h by h.State раздельно ( есть вариант записи заглавными буквами GroupBy )
Predicate – это условие, которое характеризует субъект. Например:

 where i % 2 == 0

Есть 2 варианта записи LINQ ( синтаксис метода/method и синтаксис запроса/query ):

var data=Enumerable.Range(1,100);
var method=data.Where(x=>x%2==0).Select(x=>x.ToString());
var query=from d in data where d%2==0 select d.ToString();

Простые методы LINQ:

var values=new[]{“A”,”B”,”C”,”B”,”B”,”A”,”B”};
var distinct=values.Distinct(); // только неуникальные значения
var first=values.First();
var firstordef=values.FirstOrDefault();
var twoval=values.Skip(2).Take(2);

Интересна возможность вместо && использовать where несколько раз. Например:

var evenNumbers = from i in myArray where i % 2 == 0 where i > 5 select i;

Можно использовать функции в качестве фильтра. Например:

var evenNumbers = from i in myArray where IsEvenAndGT5(i) select i;
static bool IsEvenAndGT5(int i)
{
return (i % 2 == 0 && i > 5);
}

Если необходимо выбрать несколько значений, то нужно использовать new { }

var names = from p in people select new { p.FirstName, p.LastName };

Причем, можно задать даже псевдонимы:

var names = from p in people select new { First = p.FirstName, Last = p.LastName };

var names = people.Select(p => new { p.FirstName, p.LastName }); // вариант запроса с синтаксисом метода

LINQ deferred execution — до тех пор, пока элемент не вызывается запрос не выполняется. Пример:

int[] myArray = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            var evenNumbers = from i in myArray where i % 2 == 0 select i;
            foreach (int i in evenNumbers)
            {
                Console.WriteLine(i); // выводим результат LINQ запроса
            }
            myArray[1] = 12; // изменяется элемент массива из которого происходит выборка запросом
            foreach (int i in evenNumbers) // здесь еще раз происходит вызов запроса LINQ
            {
                Console.WriteLine(i); // выводится первым элементом уже 12 а не 2
            }
// а вот следующий запрос это Immediate Execution. Данные извлекаются сразу
            var evenNumbersCount=(from i in myArray where i % 2 == 0 select i).Count();

Версия сборки состоит из четырех частей: Major, Minor, Build, and Revision

Для установки сборки в GAC (Global Assembly Cache) необходима утилита Global Assembly Cache tool (Gacutil.exe). В командной строке вводится команда: gacutil –i
Но необходимо, чтобы сборка была подписана ключом строгого имени с помощью средства SN
Пример создания ключа: «C:GACKeyGACkey.snk» sn –k
Сборка со строгим именем (strong name) состоит из 5-ти частей:Friendly Name, Version, Culture, Public Key Token, and Processor Architecture
Подписывая Ваши сборки, храните ключ в надежном месте, а разработчикам выдайте открытую часть ключа, что позволит им использовать сборки без полной подписи.
Выделить открытую часть ключа можно следующей командой:
Sn.exe –p «ключ.snk» «открытый ключ.snk»

Так как версия сборки важна в тот момент, когда runtime пытается найти сборку, то вы можете публиковать различные версии одной и той же сборки в GAC и избежать проблем, которые случаются с обычными dll.
Это называется side-by-side hosting, при котором множество версий одной и той же сборки хостятся одновременно на одном компьютере (начиная с .Net 4).

Shallow copy — ловушка при копировании массивов
При копировании объектов ссылочного типа может быть скопирован указатель на значение, а не само значение. Пример:

Person[] orginal = new Person[1];
orginal[0] = new Person() { Name = "John" };
Person[] clone = (Person[])orginal.Clone();
clone[0].Name = "Mary";  
// что интересно – теперь и original[0] и clone[0] содержат “Mary” так как массив ссылочного типа

Person[] orginal = new Person[1];
orginal[0] = new Person() { Name = "John" };
Person[] clone = (Person[])orginal.Clone();
clone[0] = new Person() { Name = "Bob" }; 
// что интересно теперь original[0]=”John” а clone[0]=”Bob”
// т.к. ссылка на первый элемент массива original была заменена новым созданным элементом

Closures ( замыкания )

var funcs = new List<Func>();
for (int i = 0; i < 3; i++)
{
    funcs.Add(() => i);
}
foreach (var f in funcs)
    Console.WriteLine(f());  // Выведет на экран 3 3 3 а не 1 2 3 как ожидается…

Данный результат обусловлен двумя причинами:
1. при замыканиях осуществляется захват переменных, а не значений переменных и
2. в приведенном фрагменте кода, существует один экземпляр переменной i, который изменяется на каждой итерации цикла, а не создается новый экземпляр на каждой итерации.

Исправить данную ситуацию довольно просто:

var funcs = new List<Func>();
for (int i = 0; i < 3; ++i)
{
    int tmp = i;  // создаем временную переменную
    funcs.Add(() => tmp); 
// при добавлении в List происходит захват значения временной переменной
}
foreach (var f in funcs)
    Console.WriteLine(f()); // теперь все в порядке и мы получим 1, 2, 3

Вы директивы компилятора используете? Вот пара директив для примера:
#region и #endregion – ограничивают какую-то часть кода и разрешают сворачивание/разворачивание
#define и #undef – define задают true или false соответственно каким-либо значениям
#error – сгенерирует ошибку

Пример условия, которое в случае, если сборка в режиме DEBUG выполнит один кусок кода, а в ином случае другой:
#if DEBUG
#elif
#endif

Что такое PCL? Portable Component Library — это по сути dll, но с возможностями cross platform. То есть можно создать PCL и назначить платформы в которых она будет использоваться ( например: WP8, WinRT, Xamarin… ). По сути, добавление каждой платформы сужает возможности сборки

PDB это акроним для Program database file
PDB содержит отладочные данные и сведения о состоянии проекта, позволяющие выполнять последовательную компоновку отладочной конфигурации программы
Любой имеющий доступ к dll/exe файлу может легко произвести реверс инжиниринг для того, чтобы генерировать исходный код с PDB или без него, используя такие средства, как например, reflector. Так что, предоставление или не предоставление PDB никак не влияет не безопасность кода.

Implicit и Explicit реализации интерфейса
Допустим, что у нас есть 2 интерфейса с одинаковым методом:

interface InterfaceOne
{
    void InterfaceMethod();
}
interface InterfaceTwo
{
    void InterfaceMethod();
}

Мы создаем класс, наследуемый от двух интерфейсов и в нем объявляем метод interfaceMethod:

public class MyClass : InterfaceOne, InterfaceTwo
{
    public void InterfaceMethod()
    {
        Console.WriteLine("Угадай метод какого интерфейса вызван?");
    }
}

Сейчас мы использовали Implicit реализацию интерфейса.
А если мы укажем наименование интерфейса, то это будет Explicit реализация:

public class MyClass : InterfaceOne, InterfaceTwo
{
    void InterfaceOne.InterfaceMethod()
    {
   Console.WriteLine("Сейчас легко угадать какого это интерфейса метод, правда?");
    }
    void InterfaceTwo.InterfaceMethod()
    {
   Console.WriteLine("Сейчас легко угадать какого это интерфейса метод, правда?");
    }
}

В информатике отражение или рефлексия (синоним интроспекция, англ. reflection) означает процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения.
Пример:

void Method()
{
	var horse=new Animal();
	var type=horse.GetType();
	var method=type.GetMethod(“Speak”);
	var value=(string)method.Invoke(horse,null);   // value=”hello”;
}
public class Animal
{
	public string Speak() { return “hello”; }
}

При рефлексии сборку можно загрузить различными способами:
Assembly.LoadFrom() может сделать перенаправление на другую аналогичную сборку
Assembly.LoadFile() загружает конкретно сборку из файла.
Assembly.Load() загружает сборку по указанию ее полного имени

Разница между Convert и Parse методами в том, что Parse принимает только строку как вводное значение, в то время, как Convert может принимать и другие типы данных.
Разница между Parse/TryParse и Convert в том, что Convert может принимать нулевые значения и не выбрасывает ArgumentNullException.

Для представления положительной и отрицательной бесконечности в C# имеется две специальные константы: System.Double.NegativeInfinity и System.Double.PositiveInfinity
NegativeInfinity — Значением этой константы является результат деления отрицательного числа на нуль, также Данная константа возвращается в случае, если результат операции меньше, чем минимальное значение (MinValue).
PositiveInfinity – результат деления положительного числа на 0. Константа возвращается в случае, если значение больше, чем MaxValue.
Infinity включает в себя как NegativeInfinity так и PositiveInfinity

Ключевое слово unchecked используется для подавления проверки переполнения при выполнении арифметических операций и преобразований с данными целого типа. Если среда unchecked удалена, возникает ошибка компиляции. 2 примера:

unchecked
{
    int1 = 2147483647 + 10;
}
int1 = unchecked(2147483647 + 10);

По умолчанию C# не выбрасывает исключение, если при сужающем/narrowing преобразовании возникает ошибка с int и float типами.
Для того, чтобы исключение возникало можно использовать ключевое слово checked. Пример:

checked
{
int big = 1000000;
short small = (short)big;
}

Также можно в свойствах проекта поставить галочку о возникновении исключения при overflow/underflow

Форматирование

Console.WriteLine(somevariable.ToString("c"))  // форматирует в денежный формат
// например указав somevariable.ToString("C3", new System.Globalization.CultureInfo("fr-FR")) в случае если somevariable=123.4562 получим -123,456 €
// ToString("d") или ToString("D") форматирует число в виде decimal
// можно указать число в виде минимального количества символов. Например, указав ("D6") получим из -1234 число -001234 
DateTime.Now.ToString("D")  
// в случае, если параметром является дата, форматирует в короткий формат даты = DateTime.Now.ToShortDateString()
DateTime.Now.ToString("d")  // длинный формат даты

Rethrow exception
Стек ошибки очищается каждый раз, когда выбрасывается ошибка.

static string ReadAFile(string fileName) {
    string result = string.Empty;
    try {
        result = File.ReadAllLines(fileName);
    } catch(Exception ex) {
        throw ex; // Это отобразит ReadAFile в StackTrace – не совсем верное решение
        throw;    // Это же отобразит ReadAllLines в StackTrace – лучше использовать такое
    }

Рекомендуется использовать просто throw, так как в таком случае сохранится информация об исходной ошибке.

Как вариант можно создать свою ошибку — custom exception

[Serializable()]
public class YourCustomException : System.Exception
{
   // конструктор принимает текст как параметр
   public YourCustomException(string msg) : base(msg)
   {

   }
}

И после можно выбрасывать ошибку:

try
{
throw new YourCustomException("Вам нельзя вводить текст в это поле");
// какой-то код
}
catch(YourCustomException e){}

Не следует наследовать от System.ApplicationException. В идее было, что все C# runtime ошибки должны наследоваться от System.Exception, а все custom exceptions от System.ApplicationException. Но в реалии класс System.ApplicationException не используется совсем.

В блока try/catch/finally — finally выполняется всегда. Только в случае вызова в коде Environment.FailFast(String) или FailFast(String, Exception), которые прерывают текущий процесс, в случае каких-либо критических повреждений в работе приложения, выполнение программы будет прервано и finally не будет выполнено.

CodeDOM – это набор классов, которые позволяют генерировать код.
Класс System.CodeDom.CodeCompileUnit – это класс верхнего топ-уровня, контейнер для всех объектов в генерируемом классе.
Класс System.CodeDom.CodeDOMProvider генерирует класс файла на C#, VB или JScript.

Структуры как и классы могут иметь методы, свойства, конструкторы и др.
Структуры в отличие от классов не могут содержать деструкторы ( фактически деструкторы это Finalize методы ~ИмяКласса которые позволяют уничтожить объект )
Нельзя объявить пустой конструктор для структуры.
Также структуры не могут иметь иерархии наследования (для экономии памяти). В C# структуры запечатаны — implicitly sealed. Что означает, что наследовать от структуры нельзя.
Структуры – это value тип данных = хранится в стеке.
Классы – это reference тип данных = хранится в куче ( heap ).
В C# к Value типу данных относятся структуры и перечисления (structs и enumerations).
Структуры в свою очередь делятся на подкатегории: числовой тип (целочисленный — integral types, с плавающей точкой — floating-point types, 128-и разрядный decimals), булев тип (bool) и пользовательские структуры.
Перечисления это набор типов, объявленный с помощью ключевого слова enum.
У value типа данных есть ограничения. Вы не можете наследовать от value типа, а также value тип не может содержать в себе значение null.

enum Months {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sept, Oct, Nov, Dec};
// можно использовать не int а другой числовой тип для enum
enum Months : byte {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sept, Oct, Nov, Dec};

string name = Enum.GetName(typeof(Months), 8);
Console.WriteLine("Восьмой месяц в enum это " + name);

Console.WriteLine("Числовые значения Months enum:");
foreach (int values in Enum.GetValues(typeof(Months)))
{
Console.WriteLine(values);
}

Класс Interlocked — Предоставляет атомарные операции для переменных, общедоступных нескольким потокам ( операции Decrement(Int), Increment(Int), Add(Int, Int) ) Значение переменной будет изменено одновременно для всех потоков.
Метод CompareExchange — сравнивает два значения на равенство и, если они равны, заменяет одно из значений.

Interlocked.CompareExchange(ref value, newvalue, comparevalue)

Метод Exchange — задает переменную указанным значением — как атомарная операция и возвращает исходное значение. Пример:

if (Interlocked.Exchange(ref isInUse, 1) ==0){
// какой-то код
 }

Параметры, передаваемые функциям

static int CalculateBMI(int weight, int height)
    {
        return (weight * 703) / (height * height);
    }

Стандартно функция вызывается так: CalculateBMI(123, 64);
Если не помнить порядок, то можно вызывать функцию, указывая названия:

CalculateBMI(weight: 123, height: 64);
CalculateBMI(height: 64, weight: 123);

Можно сперва указать параметр по порядку, а затем по имени

CalculateBMI(123, height: 64);

Но нельзя указывать сперва параметр по имени, а затем по порядку ( вызовет ошибку )

//CalculateBMI(weight: 123, 64);

Можно указывать значения для параметров по умолчанию и вызывать после функцию без указания этих параметров:

public void ExampleMethod(int required, string optionalstr = "default string", int optionalint = 10)

Использование StringWriter и StringReader для записи и чтения строк

	    StringWriter strwtr = new StringWriter();
	    for(int i=0; i < 10; i++)
	    strwtr.WriteLine("This is i: " + i);
	  	  
	    StringReader strrdr = new StringReader(strwtr.ToString());
	    // Сейчас читаем из StringReader.
	    string str = strrdr.ReadLine();
	    while(str != null) {
	    str = strrdr.ReadLine();
	    Console.WriteLine(str);

Сравнение Generics и ArrayList

var objects=new ArrayList();
objects.Add(1);
objects.Add(2);
objects.Add(“three”); // ArrayList принимает различные типы дынных

var list=new List<int>();
list.Add(1);
list.Add(2);
list.Add(“three”); 
// последнее непозволительно, так как generic коллекция в данном случае принимает только int тип данных

Regex ( регулярные выражения )
Пример IsMatch:

 if (Regex.IsMatch(phone, @"^d{3}-d{4}$"))

Matches — Ищет во входной строке все вхождения регулярного выражения и возвращает все соответствия:

      string pattern = @"bw+esb";
      Regex rgx = new Regex(pattern);
      string sentence = "Who writes these notes?";
      foreach (Match match in rgx.Matches(sentence))
      Console.WriteLine("Found '{0}' at position {1}",  match.Value, match.Index);

Match – работает точно так же как и Matches, но ищет только первое совпадение
Split — Разделяет входную строку в массив подстрок в позициях, определенных соответствием регулярного выражения.
string input = «plum-pear»;
string pattern = «(-)»;

string[] substrings = Regex.Split(input, pattern);

Replace — В указанной входной строке заменяет все строки, соответствующие шаблону регулярного выражения, указанной строкой замены.
^ — начало строки $ — конец строки. – какой-либо символ
* — повторения предыдущего 0 или несколько раз
+ — повторение предыдущего 1 или несколько раз
? – повторение предыдущего 0 или 1 раз
[abc] – какой-то из символов a,b или c [^abc] – какой-то из символов кроме этих [a-z] – символы от и до [^a-z] – символы кроме от и до
{n} – совпадение n повторений {n,} – совпадение от n до бесконечности {n,m} – совпадение от n и до m раз
d – число D – не число s – пробел, таб и т.п. S – не пробел

Немного «вредных» советов

Несмотря на запрет распространения информации об экзамене, при поиске в сети вполне можно найти дампы (сливы информации по вопросам) в частности и к этому экзамену. Стоит ли ими пользоваться и насколько сильно они могут помочь в сдаче экзамена? Даже судя по записям в блогах, пользуются ими многие.

На мой взгляд, зацикливаться на дампах не стоит. Например, потому что они содержат в себе множество ошибок. Также, следует учесть то, что вопросы время от времени вопросы заменяются. Можно ли смухлевать при сдаче? Пожалуй, немного повезти с вопросами может, но ведь для нас важна не бумажка, а владение языком, правда?
Довольно легальным способом найти примеры вопросов может быть ознакомление с вопросами из книг: «MCSD Certification Toolkit Exam 70-483 Programming in C#» и «Wouter de Kort Programming in C# Exam Ref 70-483». Книги на английском (как собственно и сам экзамен) и могут помочь вам прокачать свои знания технического английского. Я бы советовал, изучая различные вопросы, обращать внимание не на варианты ответа, а на саму тему вопроса. Таким образом, можно узнать какие-то нюансы языка, а также проработать неизвестные области.
Из видеокурсов могу посоветовать вам курс на MVA ( портал совершенно бесплатный )
www.microsoftvirtualacademy.com/training-courses/developer-training-with-programming-in-c
Довольно интересная, обучающая не только C#, но и при желании и Java онлайн игра находится по адресу www.codehunt.com В качестве подготавливающей к тестированию она не подойдет, но может быть интересна в качестве разминки.

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

На этом «вредные» советы заканчиваются. Это лишь только часть того что нужно знать и помнить.
Желаю всем высоких баллов, а также, конечно же, знаний и понимания языка C#

You are implementing a method named FloorTemperature that performs conversions between value types and reference types. The following code segment implements the method. (Line numbers are included for reference only.)

You need to ensure that the application does not throw exceptions on invalid conversions.
Which code segment should you insert at line 04?

  • A. int result = (int)degreesRef;
  • B. int result = (int)(double)degreesRef;
  • C. int result = degreesRef;
  • D. int result = (int)(float)degreesRef;

You are developing an application by using C#.
The application includes an object that performs a long running process.
You need to ensure that the garbage collector does not release the object’s resources until the process completes.
Which garbage collector method should you use?

  • A. WaitForFullGCComplete()
  • B. SuppressFinalize()
  • C. WaitForFullGCApproach()
  • D. WaitForPendingFinalizers()

You are developing an application that uses structured exception handling. The application includes a class named Logger. The Logger class implements a method named Log by using the following code segment: public static void Log(Exception ex) { }
You have the following requirements:
-> Log all exceptions by using the Log() method of the Logger class.
-> Rethrow the original exception, including the entire exception stack.
You need to meet the requirements. Which code segment should you use?

  • A. Option A
  • B. Option B
  • C. Option C
  • D. Option D

Answer :
D

Explanation:
Once an exception is thrown, part of the information it carries is the stack trace. The stack trace is a list of the method call hierarchy that starts with the method that throws the exception and ends with the method that catches the exception. If an exception is re-thrown by specifying the exception in the throw statement, the stack trace is restarted at the current method and the list of method calls between the original method that threw the exception and the current method is lost. To keep the original stack trace information with the exception, use the throw statement without specifying the exception.
References:
https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/ms182363(v=vs.110)

DRAG DROP —
You are developing an application that will include a method named GetData. The GetData() method will retrieve several lines of data from a web service by using a System.IO.StreamReader object.
You have the following requirements:
-> The GetData() method must return a string value that contains the entire response from the web service.
-> The application must remain responsive while the GetData() method runs.
You need to implement the GetData() method.
How should you complete the relevant code? (To answer, drag the appropriate objects to the correct locations in the answer area. Each object may be used once, more than once, or not at all. You may need to drag the split bar between panes or scroll to view content.)
Select and Place:

Answer :

You are developing an application that includes a class named BookTracker for tracking library books. The application includes the following code segment. (Line numbers are included for reference only.)

You need to add a book to the BookTracker instance.
What should you do?

A.

B.

C.

D.

You use the Task.Run() method to launch a long-running data processing operation. The data processing operation often fails in times of heavy network congestion.
If the data processing operation fails, a second operation must clean up any results of the first operation.
You need to ensure that the second operation is invoked only if the data processing operation throws an unhandled exception.
What should you do?

  • A. Create a task within the operation, and set the Task.StartOnError property to true.
  • B. Create a TaskFactory object and call the ContinueWhenAll() method of the object.
  • C. Create a task by calling the Task.ContinueWith() method.
  • D. Use the TaskScheduler class to create a task and call the TryExecuteTask() method on the class.
  • E. Create a TaskCompletionSource<T> object and call the TrySetException() method of the object.
  • F. Examine the Task.Status property immediately after the call to the Task.Run() method.
  • G. Create a task inside the existing Task.Run() method by using the AttachedToParent option.

Answer :
C

Explanation:
Task.ContinueWith — Creates a continuation that executes asynchronously when the target Task completes. The returned Task will not be scheduled for execution until the current task has completed, whether it completes due to running to completion successfully, faulting due to an unhandled exception, or exiting out early due to being canceled.
References:
http://msdn.microsoft.com/en-us/library/dd270696.aspx

You have the following code. (Line numbers are included for reference only.)

What is the output of line 04?

  • A. Error
  • B. 0
  • C. null
  • D. NaN

Answer :
B

References:
https://www.dotnetperls.com/divide

DRAG DROP —
You have the following code:

parameter into the CompanyInfo class.
How should you complete the code? To answer, drag the appropriate code elements to the correct targets. Each code element may be used once, more than once, or not at all. You may need to drag the split bar between panes or scroll to view content.
NOTE: Each correct selection is worth one point.
Select and Place:

Answer :

References:
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-serialize-and-deserialize-json-data

HOTSPOT —
You are developing a method named Method1 for a class named Class1. and returns to a decimal value.
You need to ensure that calls to Method1 support being executed on separate threads.
How should you complete the method signature? To answer, select the appropriate options in the answer area.
NOTE: Each correct selection is worth one point.
Hot Area:

Answer :

Reference:
https://docs.microsoft.com/en-us/dotnet/csharp/async

You are creating an application that manages information about your company’s products. The application includes a class named Product and a method named
.

Save —
The Save() method must be strongly typed. It must allow only types inherited from the Product class that use a constructor that accepts no parameters.
You need to implement the Save() method.
Which code segment should you use?

A.

B.

C.

D.

You are creating a class named Employee. The class exposes a string property named EmployeeType. The following code segment defines the Employee class. (Line numbers are included for reference only.)

The EmployeeType property value must meet the following requirements:
The value must be accessed only by code within the Employee class or within a class derived from the Employee class.
The value must be modified only by code within the Employee class.
You need to ensure that the implementation of the EmployeeType property meets the requirements.
Which two actions should you perform? (Each correct answer represents part of the complete solution. Choose two.)
NOTE: Each correct selection is worth one point.

  • A. Replace line 03 with the following code segment: public string EmployeeType
  • B. Replace line 06 with the following code segment: protected set;
  • C. Replace line 05 with the following code segment: private get;
  • D. Replace line 05 with the following code segment: protected get;
  • E. Replace line 03 with the following code segment: protected string EmployeeType
  • F. Replace line 06 with the following code segment: private set;

You are developing an application by using C#.
The application includes an object that performs a long running process.
You need to ensure that the garbage collector does not release the object’s resources until the process completes.
Which garbage collector method should you use?

  • A. RemoveMemoryPressure()
  • B. ReRegisterForFinalize()
  • C. WaitForFullGCComplete()
  • D. KeepAlive()
  • E. Collect()

You have the following C# code.
StringBuilder sb = new StringBuilder(reallyLongString);
The reallyLongString variable is a string in which a very long string is stored.
You need to identify whether a string stored in an object named StringToFind is within the StringBuilder sb object.
Which code should you use?

  • A. sb.Equals(stringToFind);
  • B. sb.ToString().IndexOf(stringToFind);
  • C. sb.ToString().CompareTo(stringToFind);
  • D. sb.ToString().Substring(stringToFind.Length);

Answer :
A

References:
https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.equals?view=netframework-
4.7.2#System_Text_StringBuilder_Equals_System_Text_StringBuilder_

DRAG DROP —
You are developing an application by using C#. The application will process several objects per second.
You need to create a performance counter to analyze the object processing.
Which three actions should you perform in sequence? (To answer, move the appropriate actions from the list of actions to the answer area and arrange them in the correct order.)
Select and Place:

Answer :

Explanation:
Note:
Example:
CounterCreationDataCollection counterDataCollection = new CounterCreationDataCollection(); // Box1
// Add the counter. Box 1
CounterCreationData averageCount64 = new CounterCreationData(); averageCount64.CounterType = PerformanceCounterType.AverageCount64; averageCount64.CounterName = «AverageCounter64Sample»; counterDataCollection.Add(averageCount64);
// Add the base counter.
CounterCreationData averageCount64Base = new CounterCreationData(); averageCount64Base.CounterType = PerformanceCounterType.AverageBase; averageCount64Base.CounterName = «AverageCounter64SampleBase»; counterDataCollection.Add(averageCount64Base); // Box 2
// Create the category. Box 3
PerformanceCounterCategory.Create(«AverageCounter64SampleCategory»,
«Demonstrates usage of the AverageCounter64 performance counter type.»,
PerformanceCounterCategoryType.SingleInstance, counterDataCollection);

You are developing an application. The application calls a method that returns an array of integers named customerIds.
You define an integer variable named customerIdToRemove and assign a value to it. You declare an array named filteredCustomerIds.
You have the following requirements.
-> Remove duplicate integers from the customerIds array.
-> Sort the array in order from the highest value to the lowest value.
-> Remove the integer value stored in the customerIdToRemove variable from the customerIds array.
You need to create a LINQ query to meet the requirements.
Which code segment should you use?

  • A. Option A
  • B. Option B
  • C. Option C
  • D. Option D

Образование

Вот и очередной разработчик, созревший для получения сертификата. Зачем мне это нужно? Как и у многих людей с такой же целью причины очень похожи:

1. Повышение собственных знаний разработки на языке C#

2. Большой плюс в резюме

3. Как писал один человек в подобной цели: «Читаю-читаю умные книги, а осязаемого результата не видать. Сдам экзамен — хоть будет видно, что не зря все это.» — абсолютно аналогичная ситуация. Книги покупаю, книги читаю, видимого результата не вижу.

В данный момент на экзамен Microsoft 70-483 действует акция Second Shot, которая позволяет в течении 30 дней после первой попытки сдачи экзамена бесплатно сдать второй раз (если первая попытка завершилась неудачно). Данная акция действует до 31 мая 2015 года, что мне очень на руку — есть мотивация не пропускать занятия, не лениться, а учить в бодром темпе. Я очень надеюсь, что вторая попытка мне не понадобится, но приятно будет знать, что второй бесплатный шанс есть. Таким образом я ставлю дату завершения цели — 15 мая 2015 года. (upd. 12.05.2015 — перенёс дату экзамена на пару дней, на 18 мая 2015 года)

 Критерий завершения

Получение сертификата

  1. Сбор информации о необходимых материалах для подготовки к экзамену

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

    1. Kort W. — Exam Ref 70-483. Programming in C#

    2. Дж. Рихтер — CLR via C#. Программирование на платформе Microsoft.NET Framework 4.5 на языке C#

    3. И в дополнение MSDN, stackoverflow

    upd. 05.05.2015

    4. Добавил ещё одну книгу для изучения «MCSD Certification Toolkit (Exam 70-483)»

  2. Поиск будущего места сдачи экзамена

    Если вдруг кто из Оренбурга задался подобной целью — сдать экзамен можно в ЦИТ Оренбургского Государственного Университета.

  3. Изучение книги Exam Ref 70-483. Programming in C#

    Буду поэтапно вычеркивать изученные главы.

    1. Objective 1.1: Implement multithreading and asynchronous processing

    2. Objective 1.2: Manage multithreading

    3. Objective 1.3: Implement program flow

    4. Objective 1.4: Create and implement events and callbacks

    5. Objective 1.5. Implement exception handling

    6. Objective 2.1: Create types

    7. Objective 2.2: Consume types

    8. Objective 2.3: Enforce encapsulation

    9. Objective 2.4. Create and implement a class hierarchy

    10. Objective 2.5. Find, execute, and create types at runtime by using reflection

    11. Objective 2.6. Manage the object life cycle

    12. Objective 2.7. Manipulate strings

    13. Objective 3.1: Validate application input

    14. Objective 3.2: Perform symmetric and asymmetric encryption

    15. Objective 3.3: Manage assemblies

    16. Objective 3.4: Debug an application

    17. Objective 3.5. Implement diagnostics in an application

    18. Objective 4.1: Perform I/O operations

    19. Objective 4.2: Consume data

    20. Objective 4.3: Query and manipulate data and objects by using LINQ

    21. Objective 4.4. Serialize and deserialize data

    22. Objective 4.5. Store data in and retrieve data from collections

  4. Изучение книги Дж. Рихтер — CLR via C#. Программирование на платформе Microsoft.NET Framework 4.5 на языке C#

    По возможности буду читать эту книгу и во время изучения Exam Ref 70-483. Programming in C#

  5. Изучение книги «MCSD Certification Toolkit (Exam 70-483)»

  6. Повторение, «подтягивание» слабых мест

  7. Сдача экзамена

  • 7468
  • 13 марта 2015, 09:42

Не пропустите новые записи!

Подпишитесь на цель и следите за ее достижением

Не так давно мне на работе перепал ваучер на бесплатную сдачу экзамена от Microsoft. «А почему бы и нет?» — подумал я. План был выполнен успешно, в связи с чем мне хотелось бы поделиться личным опытом. Возможно, эта история пригодится тем, кто только собирается начать получать сертификации от Microsoft.

Выбираем экзамен

Я очень долго медитировал на схему, приведённую выше. Ух, ну и понаделали же разных экзаменов! Увы, большинство из них (всякие Lync Server, SharePoint, JavaScript и т.п.) не привлекли моего внимания. Выбор остановился на экзамене 070-483 «Programming in C#».

Готовимся к экзамену

Перед экзаменом полагается готовиться.
Я пришёл к выводу, что лучшей подготовкой к экзамену будет несколько лет программирования на C#.
Если хочется почитать книжку, то лучше всего пойдёт классика под .NET: CLR via C# от Джеффри Рихтера.
Но, давайте взглянем, что же предлагает нам интернет в плане подготовки.
Первой книжкой, которая попалась мне на глаза, была MCSD Certification Toolkit (Exam 70-483): Programming in C#.
Ох, лучше бы я её никогда не открывал. И вам не советую. С первых же глав в глаза бросается чудовищное количество ошибок. Причём, не спорных мест, а именно очень грубых ошибок. Готовиться по ней к чему бы то ни было просто не представляется возможным.
Второй книжка была Exam Ref 70-483: Programming in C# от замечательного человека по имени Wouter de Kort. Это уже намного более адекватное чтиво. Не скажу, что по ней можно на 100% подготовится, но она хотя бы даёт неплохое представление о том, что вообще нужно знать к экзамену.
Можете также почитать достаточно подробную рецензию на эти книжки.
А ещё, я наткнулся на замечательный блог mypathto70-483.blogspot.ru. Автор блога основательно готовится к экзамену, подробно прорабатывая каждую (даже самую небольшую) тему из экзаменационного перечня. По мере подготовки с хорошей регулярностью появляются соответствующие посты. Update: В настоящее время автор успешно сдал экзамен.

Хочется отметить, что если вы неплохой .NET-разработчик, если вы понимаете как работает платформа и неплохо помните стандартные классы, то можно почти не готовиться. Разве что, просмотреть те темы, с которыми вам сталкиваться не приходилось (например, криптографию, многопоточность, работу со сборками или профилирование приложений — далеко не всем по работе попадаются все тематики экзамена).

Записываемся на экзамен

Большую часть времени я нахожусь в Новосибирске, так что экзамен решил проходить тут же. В Нск сертификацией от Microsoft занимается Сибинфоцентр. Если есть какие-то непонятности, то можно туда позвонить и получить подробную консультацию по всем интересующим вас вопросом.

Непосредственную регистрацию необходимо проходить на сайте https://www.prometric.com. У сайта, мягко говоря, с навигацией проблемы. Дам подсказку: чтобы записаться на экзамен, нужно сначала зарегистрироваться. А регистрация происходит по нажатию на надпись «IT TEST TAKER Account Sign-In» в центре страницы, которая умело маскируется под радиобаттон. После этого всё просто: проходите регистрацию, выбираете экзамен (категория Microsoft (070, 071, 074, MBx)), выбираете нужный центр тестирования и удобное для вас время. Как правило, свободного времени хватает — отчего-то особых очередей на сдачу Microsoft-овских экзаменов не наблюдается.

Сдаём экзамен

В Сибинфоцентре мне очень понравилось. Пришёл я с хорошим временным запасом, так что мне предложили дождаться начала экзамене в местной комнате отдыха:

Комната отдыха хороша: есть чай, кофе и вкусные печеньки. Причём, печеньки действительно вкусные — ощущается, что ребята не набрали каких попало, а именно выбирали повкуснее. Ценю я внимание к мелочам =). Также есть всякие проспектики о проводимых в центре сертификациях, так что вполне можно занять себя кофейком и полезным чтением.

Вскоре пришёл ответственный за проведение Microsoft-овского тестирования. Надо отдать ему должное — он меня хорошо проинструктировал о процессе прохождении экзамена и подробно ответил на все вопросы. В общем, ребята держат достойный уровень.

Перед экзаменом необходимо предъявить два удостоверения личности (в моём случае подошли паспорт и водительское удостоверение). Все личные вещи складываются в сейф, т.к. в экзаменационную комнату их проносить нельзя. С собой выдаётся лишь два специальных листа бумаги и два маркера (впрочем, за время экзамена мне не довелось их испытать).

Перед экзаменом я наподписывал всяких NDA, поэтому особо ничего про экзамен рассказать не могу, ограничусь лишь впечатлениями. Экзамен меня порадовал: все вопросы весьма адекватные и корректные (что особенно радует после подготовительной литературы). Было несколько вопросов, которые меня смутили, но тут скорее всего со мной что-то не так, а не с экзаменом. Тестирующая система тоже порадовала: всё понятно, пользоваться удобно, ничего не глючит — сплошное удовольствие. Перед экзаменом также можно пройти быстрый туториал по тому, как ей пользоваться, ввиду чего непонятных моментов не остаётся вовсе. Основная часть экзамена идёт два часа, но этого более, чем достаточно. Если вы всё знаете, то можно успеть прочитать каждый вопрос на несколько раз, подумать, ещё раз перечитать вопрос, ещё раз основательно подумать, выбрать правильный ответ, а по окончанию тестирования ещё раз всё проверить. А если вы что-то не знаете, то дополнительное время не особо поможет. У меня на всё вместе с проверкой ушло 1.5 часа. После окончания тестирования вам предложат написать комментарии к вопросам (они отправляются в Microsoft для улучшения качества тестирования), а также пройти короткий опросник об уровне сертификации (но это всё опционально). Предварительные результаты (а скорее всего они и будут окончательными) сразу показываются на экране.

После успешного прохождения экзамена вам на руки выдаются ваши результаты в печатном виде с рифлёной печатью и подписью, после чего предлагается ждать письма на почту. Результаты тестирования отправляются сперва в Prometrics, затем в Microsoft, где их должны аккуратно проверить в течении 7 рабочих дней. Начитавшись разных отзывов о получении MCP (раз, два) я опасался, что эта часть затянется. Но Microsoft меня порадовали: уже на следующий день мне пришло письмо, по ссылке из которого я зарегистировался на сайте mcp.microsoft.com. После этой процедуры выдаётся учётная запись, с которой связывается свежевыданный Micrisoft Certification ID. Из под этой учётной записи можно в любой момент смотреть все сданные экзамены, планировать будущие экзамены и расшаривать данные о сертификатах заинтересованным лицам. Собственно говоря, после регистрации я увидел у себя две записи: MCPS: Microsoft Certified Professional и MS: Programming in C# Specialist. Выглядят они примерно так:

У Microsoft есть также более крутые сертификации, для получения которых нужно пройти несколько экзаменов. После 70-483 можно качаться либо в MCSD: Windows Store Apps Using C#, либо в MCSD: Web Applications. Но, увы, подобные штуки меня уже не настолько вдохновляют. Так что будем ждать, когда MS проведут очередную реорганизацию системы сертификатов, чтобы в ней появилось что-нибудь более заманчивое =).

Выводы

Впечатления от мероприятия сугубо положительные, опыт полезный. Если вы в себе ощущаете силы пройти подобную сертификацию, а также у вас есть на это время и возможности ($80 или ваучер), то я бы посоветовал озадачиться. Как минимум, это достаточно интересно, а бумажка от MS тоже лишней не будет, можно будет включить в резюме.

Белорусско-Савеловский

3-я ул. Ямского Поля, д. 32, 1-й подъезд, 5-й этаж

Радио

ул. Радио, д.24, корпус 1, 2-ой подъезд, 2-ой этаж

Таганский

ул. Воронцовская, д. 35Б, корп.2, 5-ый этаж

Бауманский

ул. Бауманская, д. 6, стр. 2, бизнес-центр «Виктория Плаза», 4-й этаж

Довольно продолжительное время (~TimeSpan.FromDays(100)) ни в этом блоге, ни на моей странице на Хабре
не появлялось новых публикаций. Причин этому было две. Первая, моя академическая деятельность в Балтийском Федеральном Университете
подошла к концу.

Вторая, появившееся свободное время я занял подготовкой к сдаче сертификационного экзамена Microsoft «70-483: Programming in C#».

Сразу отмечу, что содержание экзамена полностью совпадает с заявленной в «Skills measured» программой. Что не очень подходит как для
любителей сюрпризов, так и тем, кто пару пунктов из программы решит в процессе подготовки пропустить.

По уже не новым для .NET-разработчиков темам – async/await, Task Parallel Library – уровень вопросов откровенно поверхностный. При
подготовке к экзаменам у меня не получилось заинтересоваться рекомендуемыми Microsoft материалами для подготовки.
Книга «Exam Ref 70-483: Programming in C#» [1] показалась крайне неглубокой, а книга «MCSD Certification Toolkit (Exam 70-483): Programming in C#» [2] –
чересчур несвязанной (справедливости ради, отмечу, что на последнем этапе подготовки я бегло прочитал обе).
Рекомендуемый в «Preparation options»
курс MVA «Programming in C# Jump Start» уже на первых уроках вызвал у меня трудно скрываемое ощущение, что это все не тот уровень, который я
хочу получить в процессе подготовки к сертификации.

Поэтому я сделал, так, как делаю, наверное, многие enterprise (и просто опытные) разработчики: взял последнее издание Рихтера [3] и въедливо прочитал его.

Немного снять неуверенность в собственных знаниях помогли тесты из уже упомянутых мною книг [1, 2]. Снять излишнюю самоуверенность в своих знаниях помогло понимание того, что все равно вопросы на сертификации будут кардинально отличаться по формату и сложности от тестов из [1, 2].

После окончания подготовки и прохождения сертификации «70-483: Programming in C#» в Prometric-центре, ко мне пришло четкое осознание, что твои прикладные знания по конкретным кейсам помогут тебе на сертификации по 5 вопросам, по остальным 75 вопросам – помогут понимание концепций, заложенных в C#, и фундаментальные знания .NET Framework.

Сегодня с утра был тот редкий случай, когда письмо от Microsoft в электронном ящике доставляет радость — «коллективный» Microsoft поздравил меня с успешной сдачей сертификационного экзамена «Programming in C#».

Всем крепких знаний и интересной работы!

Материалы для подготовки

  • [0] Экзамен 70-483: Programming in C# (на русском). Microsoft.com.
  • [1] Wouter de Kort. Exam Ref 70-483: Programming in C#. — Microsoft Press, 2013.
  • [2] Tiberiu Covaci, Rod Stephens, etc. MCSD Certification Toolkit (Exam 70-483): Programming in C#. Wrox, 2013.
  • [3] Jeffrey Richter. CLR via C#, 4th Edition. — Microsoft Press, 2012.

Понравилась статья? Поделить с друзьями:
  • Экзамен 70 461
  • Экзамен 60 вопросов автошкола онлайн
  • Экзамен 6 класс алгоритм
  • Экзамен 5 класс математика виленкин
  • Экзамен 30 июня какой егэ