воскресенье, 28 февраля 2010 г.

Ответы на базовые вопросы по С#

Типы данных.

  1. Чему равно значение переменой i до вызова функции ModifyInt? После вызова? Почему?
    • До вызова функции ModiffyInt: i=10

После вызова функции ModiffyInt: i=10

Значение переменной не изменилось, т.к. переменная i имеет тип int, а int – это тип характеризируемый значением(value type).Т.е. вызванной функции передаётся копия переменной.

  1. Чему равно значение переменной s до вызова функции ModfyString? После вызова? Почему?

§ До вызова функции ModiffyString s = "Hello, world"

После вызова функции ModiffyString s = "Hello, world"

Значение переменной не изменилось, т.к. переменная s является переменной типа string. Хотя string и является ссылочным типом(value-types), операции присваивания, копирования....предполагают работу со значениями строк. Строки в С# не изменяемы. Т.е. вызванной функции будет передана копия строки.

  1. Какие типы являются типами-значениями (value types)? Какие типы являются типами-ссылками (reference-types)?

Безымянный

  1. Какие различия между типами-значениями и типами-сылками?

Критерий различия

value-types

reference types

Размещение типа

В стеке

В управляемой динамической памяти

Представление переменной

В виде локальной копии

В виде ссылки на место в памяти, анятое соответствующим экземпляром

Базовый тип

Производный от System.ValueType

Может получаться из любого типа, не являющегося изолированным

Возможность быть базовым для других типов

Всегда изолированы и не могут быть расширены

Если тип не изолирован, он может быть базовам для других типов

Поведение, принятое по умолчанию при передаче параметров

Переменные передаются по значению

Переменные передаются по ссылке

Возможность переопределить System.Object.Finalize

Никогда не размещаются в динамической памяти и поэтому не требуют финализации.

Возможно, неявно.

Возможность определить конструкторы для этого типа

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

Безусловно, возможно.

Время прекращения существования переменных данного типа

Удаляются, когда оказываются вне контекста определения.

Удаляются, когда для динамической памяти выполняется сборка мусора.

  1. В чем проявляется эта разница в примере types.cs?

§ Разница между типами value-types и reference types в примере types.cs не видна.

  1. Где размещаются переменные типов-значений (values-types)?

§ В стеке

  1. Где размещаются переменные типов-ссылок (reference-types)?

§ В управляемой динамической памяти

  1. Как создать новый тип-значение (values-type)?

§ Унаследовать свой класс от класса ValueType.

  1. Как создать новый тип-ссылку (reference-type)?

§ Нужно просто создать класс, при создании нового класса мы неявно наследуемся от класса System.Object.

  1. Какой тип у переменной i?

§ Переменная i имеет тип System.Int32.

  1. Какой тип у переменной j?

§ Переменная i имеет тип System.Int32.

  1. Объясните ваши наблюдения по поводу типов переменных i и j.

§ Int является сокращённым обозначением типа System.Int32. Поэтому переменная i имеет тип System.Int32. Вызванной функции передаётся копия переменной i, поэтому значение переменной не меняется после вызова функции. Переменная j также имеет тип System.Int32.

  1. Почему переменная типа-ссылки (reference type) o содержит старое значение?

§ Переменная типа-ссылки (reference type) o содержит старое значение, потому что когда значение преобразуется в объектный тип, среда CLR размещает новый объект в динамической памяти и копирует значение соответствующего типа в созданный экземпляр, а мы получаем ссылку на новый объект. Следовательно, при последующем изменении переменной I значение объекта o не меняется.

  1. Что такое boxing и unboxing?

§ Boxing-операция создания объектного образа, позволяющая превратить тип, характеризируемый значением, в ссылочный тип. Обратная операция

§ Unboxing – операция восстановления из объектного образа, т.е. преобразование значения , содержащегося в объектной ссылке, в значение соответствующего типа, размещаемое в стеке.

  1. Вoxing выполняется неявно (implicit) или явно (explicit)? Пример.

§ Boxing выполняется автоматически и неявно.

  1. Unboxing выполняется неявно (implicit) или явно (explicit)? Пример.

§ Unboxing выполняется явно. Необходимо явно преобразовать объект к нужному типу.

  1. Приведите пример для обеих вариантов.

short s = 25;

object objShort = s;//boxing

short anothrShort = (short)objShort;//unboxing

  1. Почему класс String называется неизменяемым (immutable)? Что означает «неизменяемый» (immutable)?

§ После того как экземпляр класса String создан, он не может быть изменен — все методы класса, которые изменяют содержимое стоки, возвращают новый экземпляр данного класса.

  1. Объясните, почему в следующем примере будет выведена строка

§ Потому что метод s.Trim(); вернёт новый экземпляр класса, а объект s останется прежним.

Массивы. Коллекции. Структура приложения

  1. Может ли быть более одной точки входа в программу? Какие четыре варианта сигнатуры могут быть у точки входа?

§ Нет,точка входа должна быть только одна.

§ static void Main(string[] args)

{

}

§ static void Main()

{

}

§ static int Main(string[] args)

{

return 0;

}

§ static int Main()

{

return 0;

}

  1. Почему нижеприведенные примеры не компилируется и какая ошибка будет получена?

§ Потому что несколько точек входа в программу.

§ Пример будет скомпилирован, но с предупреждением(возможно не правильно задана функция Main). Функция Main не может принимать во входных параметрах int[], и компилятор не считает эту функцию точкой фхода.

  1. Используя написанный ниже метод Main, напишите новый метод ModifyString, который изменяет переменную s, присваивая ей значение “Hello, I’ve been modified,” так, чтобы строчка Console.WriteLine, которая вызывается в методе Main печатала “Hello, I’ve been modified,”.

static void Main()

{

string s = "Hello, world";

ModifyString(ref s);

Console.WriteLine(s);

}

static void ModifyString(ref string str)

{

str="Hello, I’ve been modified.";

}

  1. Напишите программу, отображающую все аргументы командной строки, с которыми она вызывается.

static void Main(string[] args)

{

for (int i = 0; i < args.Length; i++)

{

Console.WriteLine("Аргумент: {0}", args[i]);

}

}

  1. Аргументы какого типа можно передавать, ограничено ли их число?

§ Параметр один: массив строк(string[] args).

§ Количество аргументов в массиве строк не ограниченно.

  1. Для чего нужно значение, которое может возвращать метод Main?

§ По окончании работы программы возвращаемое значение предоставляется системе. При успешном завершении возвращается нуль.

  1. Напишите программу на C#, которая удлиняет этот массив до 10-ти элементов от 10 до 100.

int[] arr = new int[] { 10, 20, 30, 40, 50 };

//до 10

Array.Resize<int>(ref arr, 10);

for (int i = 5; i < arr.Length; i++)

{

arr[i] = (i + 1) * 10;

}

//от 10 до 100

Array.Resize<int>(ref arr, 100);

for (int i = 10; i < arr.Length; i++)

{

arr[i] = (i + 1) * 10;

}

  1. Опишите ситуации, в которых предпочтительней использовать массивы, а не коллекции.

§ Когда необходимо хранить данные однородных типов, к которым мы хотим иметь прямой доступ.

§ Когда известен точный размер массива данных.

§ Когда необходимо осуществлять частый доступ к элементам для чтения и записи. Эти операции в массиве происходят быстрее, чем в коллекции.

  1. Опишите ситуации, в которых предпочтительней использовать коллекции, а не массивы.

§ Когда необходимо осуществлять поиск среди данных.

§ Когда необходимо хранить данные различных типов.

§ Когда неизвестен размер. Коллекция самостоятельно расширяться по мере добавления элементов.

Управляющие конструкции. Классы. Структуры

  1. напишите программу, которая разделить строку на элементы, отделенные запятыми (воспользуйтесь функцией String.Split) и помещает их в массив. Переберите элементы массива используя сначала оператор foreach, а потом еще раз, используя оператор for.

string s = "One, Two, Three, Four, Five";

string strSplit = ", ";

string[] strs = s.Split(strSplit.ToCharArray());

foreach (string s1 in strs)

{

Console.WriteLine(s1);

}

for (int i=0; i < strs.Length; i++)

{

Console.WriteLine(strs[i]);

}

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

§ Exeption возникает при попытке преобразовать значение , содержащееся в объектной ссылке, в значение не соответствующего типа.

  1. Модифицируйте программу при помощи операторов обработки исключений так, чтобы в консоль выводилось сообщение об ошибке конвертации.

static void Main()

{

int i = 1;

string s = "Hello, world";

CheckType(i);

CheckType(s);

}

static void CheckType(object o)

{

int j;

string t;

if (o is int)

{

Console.WriteLine("o is an int");

}

else

{

Console.WriteLine("o is not an int");

}

try

{

j = (int)o;

}

catch (Exception e)

{

Console.WriteLine("Ошибка конвертации!");

}

}

  1. Почему в консоль выводятся два разных значения?

§ Т.к. byte это 8 бит. При перемножении чисел у нас получается число 31110. В двоичном виде это число будет выглядеть так 111100110000110. Это число выходит за разрядную сетку типа byte, поэтому первые 8 бит отбрасываются. Остаётся 10000110, что в десятичном виде 134.

§ А без явного приведения к типу byte произведение будет неявно приведено к типу большей разрядности, и будет выведено 31110.

  1. Какие варианты являются правильными циклами do/while?

do {i++;} while {i <= 10};//Синтаксически неверно.

do {i++;} while (i <= 10);//Верно.

do() {i++;} while() {i <= 10};//Синтаксически неверно.

do() {i++;} while (i <= 10); //Синтаксически неверно.

do (i++;) while (i <= 10);//Синтаксически неверно.

  1. Структура и класс – что из них является типом-значением (value-type), а что типом-ссылкой (reference-type)? Где создаются объекты каждого типа?

§ Структура является value-type, хранится в стеке.

§ Класс является reference-type, храниться в динамической памяти.

  1. Проанализируйте, скомпилируйте и запустите файл stuct.cs и объясните, как он работает, учитывая разницу между типами-значениями (value-types) и типами-ссылками (reference-types).

§ При создании второй структуры, создаётся второй объект, который размещается в стеке и инициализируется изначально значениями полей первой структуры. Это две независимых структуры и поэтому изменение полей одной структуры никак не влияют на вторую.

§ А при создании второго объекта класса, создаётся фактически не объект, а объектная ссылка, которая указывает на первый объект, размещённый в динамической памяти. Поэтому при изменении значений полей pc2, мы на самом деле изменяем объект ps1, т.к эти ссылки указывают на один и тот же объект.

  1. В чем ключевые отличия между классами и структурами, по отношению к типам-ссылкам (reference-types) и типам-значениям (value-types)?

§ См. ответ на вопрос №4.

  1. где размещаются переменные ps1 и ps2?

§ В стеке.

  1. где размещаются переменные pc1 и pc2?

§ Ссылки на объект хранятся в стеке, а сам объект в динамической памяти.

  1. В C# всё является объектами. Приведите короткий пример, демонстрирующий это утверждение.

static void Main()

{

Console.WriteLine(5.ToString());

}

Комментариев нет:

Отправить комментарий