Типы данных.
- Чему равно значение переменой i до вызова функции ModifyInt? После вызова? Почему?
- До вызова функции ModiffyInt: i=10
После вызова функции ModiffyInt: i=10
Значение переменной не изменилось, т.к. переменная i имеет тип int, а int – это тип характеризируемый значением(value type).Т.е. вызванной функции передаётся копия переменной.
- Чему равно значение переменной s до вызова функции ModfyString? После вызова? Почему?
§ До вызова функции ModiffyString s = "Hello, world"
После вызова функции ModiffyString s = "Hello, world"
Значение переменной не изменилось, т.к. переменная s является переменной типа string. Хотя string и является ссылочным типом(value-types), операции присваивания, копирования....предполагают работу со значениями строк. Строки в С# не изменяемы. Т.е. вызванной функции будет передана копия строки.
- Какие типы являются типами-значениями (value types)? Какие типы являются типами-ссылками (reference-types)?
- Какие различия между типами-значениями и типами-сылками?
Критерий различия | value-types | reference types |
Размещение типа | В стеке | В управляемой динамической памяти |
Представление переменной | В виде локальной копии | В виде ссылки на место в памяти, анятое соответствующим экземпляром |
Базовый тип | Производный от System.ValueType | Может получаться из любого типа, не являющегося изолированным |
Возможность быть базовым для других типов | Всегда изолированы и не могут быть расширены | Если тип не изолирован, он может быть базовам для других типов |
Поведение, принятое по умолчанию при передаче параметров | Переменные передаются по значению | Переменные передаются по ссылке |
Возможность переопределить System.Object.Finalize | Никогда не размещаются в динамической памяти и поэтому не требуют финализации. | Возможно, неявно. |
Возможность определить конструкторы для этого типа | Возможно, но конструктор, заданный по умолчанию, является зарезервированным (т.е. Другие конструкторы обязательно должны иметь аргументы) | Безусловно, возможно. |
Время прекращения существования переменных данного типа | Удаляются, когда оказываются вне контекста определения. | Удаляются, когда для динамической памяти выполняется сборка мусора. |
- В чем проявляется эта разница в примере types.cs?
§ Разница между типами value-types и reference types в примере types.cs не видна.
- Где размещаются переменные типов-значений (values-types)?
§ В стеке
- Где размещаются переменные типов-ссылок (reference-types)?
§ В управляемой динамической памяти
- Как создать новый тип-значение (values-type)?
§ Унаследовать свой класс от класса ValueType.
- Как создать новый тип-ссылку (reference-type)?
§ Нужно просто создать класс, при создании нового класса мы неявно наследуемся от класса System.Object.
- Какой тип у переменной i?
§ Переменная i имеет тип System.Int32.
- Какой тип у переменной j?
§ Переменная i имеет тип System.Int32.
- Объясните ваши наблюдения по поводу типов переменных i и j.
§ Int является сокращённым обозначением типа System.Int32. Поэтому переменная i имеет тип System.Int32. Вызванной функции передаётся копия переменной i, поэтому значение переменной не меняется после вызова функции. Переменная j также имеет тип System.Int32.
- Почему переменная типа-ссылки (reference type) o содержит старое значение?
§ Переменная типа-ссылки (reference type) o содержит старое значение, потому что когда значение преобразуется в объектный тип, среда CLR размещает новый объект в динамической памяти и копирует значение соответствующего типа в созданный экземпляр, а мы получаем ссылку на новый объект. Следовательно, при последующем изменении переменной I значение объекта o не меняется.
- Что такое boxing и unboxing?
§ Boxing-операция создания объектного образа, позволяющая превратить тип, характеризируемый значением, в ссылочный тип. Обратная операция
§ Unboxing – операция восстановления из объектного образа, т.е. преобразование значения , содержащегося в объектной ссылке, в значение соответствующего типа, размещаемое в стеке.
- Вoxing выполняется неявно (implicit) или явно (explicit)? Пример.
§ Boxing выполняется автоматически и неявно.
- Unboxing выполняется неявно (implicit) или явно (explicit)? Пример.
§ Unboxing выполняется явно. Необходимо явно преобразовать объект к нужному типу.
- Приведите пример для обеих вариантов.
short s = 25; object objShort = s;//boxing short anothrShort = (short)objShort;//unboxing |
- Почему класс String называется неизменяемым (immutable)? Что означает «неизменяемый» (immutable)?
§ После того как экземпляр класса String создан, он не может быть изменен — все методы класса, которые изменяют содержимое стоки, возвращают новый экземпляр данного класса.
- Объясните, почему в следующем примере будет выведена строка
§ Потому что метод s.Trim(); вернёт новый экземпляр класса, а объект s останется прежним.
Массивы. Коллекции. Структура приложения
- Может ли быть более одной точки входа в программу? Какие четыре варианта сигнатуры могут быть у точки входа?
§ Нет,точка входа должна быть только одна.
§ static void Main(string[] args) { } § static void Main() { } § static int Main(string[] args) { return 0; } § static int Main() { return 0; } |
- Почему нижеприведенные примеры не компилируется и какая ошибка будет получена?
§ Потому что несколько точек входа в программу.
§ Пример будет скомпилирован, но с предупреждением(возможно не правильно задана функция Main). Функция Main не может принимать во входных параметрах int[], и компилятор не считает эту функцию точкой фхода.
- Используя написанный ниже метод 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."; } |
- Напишите программу, отображающую все аргументы командной строки, с которыми она вызывается.
static void Main(string[] args) { for (int i = 0; i < args.Length; i++) { Console.WriteLine("Аргумент: {0}", args[i]); } } |
- Аргументы какого типа можно передавать, ограничено ли их число?
§ Параметр один: массив строк(string[] args).
§ Количество аргументов в массиве строк не ограниченно.
- Для чего нужно значение, которое может возвращать метод Main?
§ По окончании работы программы возвращаемое значение предоставляется системе. При успешном завершении возвращается нуль.
- Напишите программу на 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; } |
- Опишите ситуации, в которых предпочтительней использовать массивы, а не коллекции.
§ Когда необходимо хранить данные однородных типов, к которым мы хотим иметь прямой доступ.
§ Когда известен точный размер массива данных.
§ Когда необходимо осуществлять частый доступ к элементам для чтения и записи. Эти операции в массиве происходят быстрее, чем в коллекции.
- Опишите ситуации, в которых предпочтительней использовать коллекции, а не массивы.
§ Когда необходимо осуществлять поиск среди данных.
§ Когда необходимо хранить данные различных типов.
§ Когда неизвестен размер. Коллекция самостоятельно расширяться по мере добавления элементов.
Управляющие конструкции. Классы. Структуры
- напишите программу, которая разделить строку на элементы, отделенные запятыми (воспользуйтесь функцией 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]); } |
- Изучите нижеприведенный пример и объясните, почему выбрасывается исключение когда вызывается метод CheckType с параметром string, но работает нормально, когда в качестве параметра этому методу передается значение типа int.
§ Exeption возникает при попытке преобразовать значение , содержащееся в объектной ссылке, в значение не соответствующего типа.
- Модифицируйте программу при помощи операторов обработки исключений так, чтобы в консоль выводилось сообщение об ошибке конвертации.
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("Ошибка конвертации!"); } } |
- Почему в консоль выводятся два разных значения?
§ Т.к. byte это 8 бит. При перемножении чисел у нас получается число 31110. В двоичном виде это число будет выглядеть так 111100110000110. Это число выходит за разрядную сетку типа byte, поэтому первые 8 бит отбрасываются. Остаётся 10000110, что в десятичном виде 134.
§ А без явного приведения к типу byte произведение будет неявно приведено к типу большей разрядности, и будет выведено 31110.
- Какие варианты являются правильными циклами 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);//Синтаксически неверно. |
- Структура и класс – что из них является типом-значением (value-type), а что типом-ссылкой (reference-type)? Где создаются объекты каждого типа?
§ Структура является value-type, хранится в стеке.
§ Класс является reference-type, храниться в динамической памяти.
- Проанализируйте, скомпилируйте и запустите файл stuct.cs и объясните, как он работает, учитывая разницу между типами-значениями (value-types) и типами-ссылками (reference-types).
§ При создании второй структуры, создаётся второй объект, который размещается в стеке и инициализируется изначально значениями полей первой структуры. Это две независимых структуры и поэтому изменение полей одной структуры никак не влияют на вторую.
§ А при создании второго объекта класса, создаётся фактически не объект, а объектная ссылка, которая указывает на первый объект, размещённый в динамической памяти. Поэтому при изменении значений полей pc2, мы на самом деле изменяем объект ps1, т.к эти ссылки указывают на один и тот же объект.
- В чем ключевые отличия между классами и структурами, по отношению к типам-ссылкам (reference-types) и типам-значениям (value-types)?
§ См. ответ на вопрос №4.
- где размещаются переменные ps1 и ps2?
§ В стеке.
- где размещаются переменные pc1 и pc2?
§ Ссылки на объект хранятся в стеке, а сам объект в динамической памяти.
- В C# всё является объектами. Приведите короткий пример, демонстрирующий это утверждение.
static void Main() { Console.WriteLine(5.ToString()); } |
Комментариев нет:
Отправить комментарий