3. Основы ООП Flashcards
Как определить класс на C#?
class MyClass { }
В чем разница между классом и объектом?
Объект — это экземпляр класса. Класс — это «чертеж» объекта.
В чем ошибка? Как исправить? class A { B b; } class B { int c; } var a = new A(); Console.WriteLine(a.b.c)
В поле b находится null и поэтому будет NullReferenceException
В чем ошибка? string a = null; var parts = a.Split(" ");
Как написать SafeSplit, чтобы не было NullReferenceException в коде string a = null; var parts = a.SafeSplit(" ");
В переменной a лежит null и поэтому будет NullReferenceException. SafeSplit должен быть методом-расширения. В этом случае он будет статическим и в нем можно обработать ситуацию a == null. При этом его можно будет вызвать как указано.
Как сделать в проекте 2 класса с одним именем?
Разместить их в разных пространствах имен (namespaces)
В чем ошибка? Как исправить?
struct A { B b; } struct B { int c; } var a = new A(); Console.WriteLine(a.b.c)
Ошибки нет, так как это struct.
В чем ошибка в коде?
public struct Point { public Point() { X = 0; Y = 0; } public int X; public int Y; }
У структуры нельзя переопределить конструктор по-умолчанию.
Что делать, если надо передать структуру в метод по ссылке?
Использовать ref.
Что такое boxing?
Неявное копирование структуры в кучу. Например, при upcast в object или реализуемый интерфейс.
Пусть Point — это структура, содержащая публичные поля X, Y и метод GetLength. В каких строчках есть ошибки и почему?
Point p; p.X = 5; var length = p.GetLength();
Только в третьей. Потому что нельзя использовать методы не инициализированной полностью структуры. А вот присвоить значение полю можно.
Что означает ключевое слово private?
Доступ к помеченному члену класса возможен только изнутри класса
Как модифицировать значения private-полей извне класса?
Напрямую — никак. Надо использовать методы класса, предусмотренные его автором, которые гарантируют целостность данных.
Что такое отложенная ошибка?
Это нарушение целостности данных, приводящее к ошибке не в момент нарушения, а намного позже
Что такое свойство?
Это пара методов: getter и setter, которые можно синтаксически использовать как поле, т.е. получать и присваивать ему значения
Сколько полей и методов будет сгенерировано компилятором при обработке этого свойства и какой у них будет уровень доступа (private, public)?
public string Name {get; private set;}
Одно приватное поле, один публичный метод, один приватный метод
Сколько полей и методов будет сгенерировано компилятором при обработке этого свойства и какой у них будет уровень доступа (private, public)?
public string Surname { get; }
Это сокращённый синтаксис для
public string Surname { get; private set; }
(Появился только в C# 6. Поэтому в 5 версии не скомпилируется)
Как вызвать из одного конструктора другой конструктор того же класса, чтобы не дублировать код?
Используя this, например, так : Rectangle(int width, int height) : this(0, 0, width, height)
Что означает, что поле readonly?
Его значение нельзя модифицировать после того, как отработал конструктор.
В чем разница между константой и readonly static полем?
Разное время вычисления значения: const вычисляется в момент компиляции, static поле в момент запуска программы. Значение константы должно быть известно на момент компиляции, поэтому множество допустимых типов сильно ограничено.
Когда выполняются статические конструкторы?
До того, как будут использованы статические или динамические поля, но не обязательно в начале программы.
Что такое интерфейс (не путать с UI) в C#?
Контракт, обязательство класса содержать некоторые методы
Что такое наследование и зачем оно нужно?
Наследование позволяет определить дочерний класс, который использует (наследует), расширяет или изменяет возможности родительского класса. Класс, члены которого наследуются, называется базовым классом. Класс, который наследует члены базового класса, называется производным классом.Наследование воплощает идею «быть частным случаем чего-то».
Что такое upcast?
Приведение значения к родительскому типу. Объект не меняется — меняется точка зрения на него.
Что такое полиморфизм и зачем он нужен?
Полиморфизм позволяет объектам производного класса обрабатываться как объектам базового класса или интерфейса. Таким образом, алгоритмы использующие в работе некоторый интерфейс могут быть применены ко всем классам-наследниками.При этом виртуальные методы и реализация интерфейса в каждом наследнике может быть различной.