class Date { private int year = 0; private int month = 0; private int day = 0; public void SetDate (int y, int m, int d) { year = y; month = m; day = d; } public string ToString() { return string.Format("{0:d4}.{1:d2}.{2:d2}", year, month, day); } 1 Данные + Методы Именование, селекторы/модификаторы Классы - 1
Date today = new Date(); today.SetDate (2011, 11, 1); Console.WriteLine( today.ToString() ); 2
using System; namespace LabWork { class Program { static void Main() { } Структура программы
Добавлен второй класс using System; namespace LabWork { class Time { //... } using System; namespace LabWork { class Program { static void Main() { Time t = new Time(); }
class Circle { private double x = 0.0; private double y = 0.0; private double r = 0.0; public void Set(double x, double y, double r) { this.x = x; this.y = y; this.r = r; } public double Square() { return Math.PI * r * r; } 5 Еще пример класса Circle c = new Circle(); c.Set (1.0, 2.3, 2.0); double square = c.Square();
Значения по умолчанию для полей классов числовые поля0 boolfalse stringnull char\0 ссылочные типыnull
Спецификаторы доступа данных и методов class Foo { private int x; public int y; private void f1() { } public void f2() { } } …. Foo f = new Foo(); int a = f.x; int b = f.y; f.f1(); f.f2();
Спецификаторы доступа класса public class Foo // Доступен из любой внешней сборки { } internal class Foo// Доступен внутри текущей сборки { } class Foo // internal { }
Перегрузка методов класса class DateTime { //.. данные..// public void Set(int year, int month, int day) { //... } public void Set(int year, int month, int day, int hour, int min, int sec) { //... }
10 Конструктор (constructor) class Point { private int x; private int y; public Point() { this.x = 0; this.y = 0; } public Point (int x, int y) { this.x = x; this.y = y; } Point p1 = new Point(); Point p2 = new Point(1, 2); Q: Когда конструктор предпочтительнее инициализатора?
11 class Point { private int x = 0; private int y = 0; public Point() : this(0,0) { } public Point(int x, int y) { this.x = x; this.y = y; } Взаимные вызовы конструкторов
12 class Point { private int x = 0; private int y = 0; public Point() : this(0,0) { } public Point(int x, int y) { this.x = x; this.y = y; } public Point(Point p) : this(p.x, p.y) { } Point p1 = new Point(1, 2); Point p2 = new Point(p1); Конструктор копирования
const int count = 5; Time[] array = new Time[count]; for(int i=0; i
Структуры Отличия от классов: 1.Передаются по значению (копируются). 2.Не могу содержать инициализаторов полей. 3.Не могут содержать конструктор по умолчанию. 4.Структуры не участвуют в наследовании, и не могут реализовывать интерфейсы. struct Point { private float x; private float y; } … Point onePoint; Point[] pointArray = new Point[10];
15 Статические методы Point p1 = new Point(21.28, 49.32); Point p2 = new Point(81.12, 37.93); double dist = p1.DistanceTo(p2); class Point { private double x = 0; private double y = 0; public Point(double x, double y) { this.x = x; this.y = y; } public double DistanceTo(Point pt) { return Math.Sqrt((pt.x-x) * (pt.x-x) + (pt.y-y) * (pt.y-y)); }
16 class Point { private double x = 0; private double y = 0; public double DistanceTo(Point pt) { return Math.Sqrt((pt.x-x) * (pt.x-x) + (pt.y-y) * (pt.y-y)); } public static double Distance(Point p1, Point p2) { return Math.Sqrt( (p2.x-p1.x) * (p2.x-p1.x) + (p2.y-p1.y) * (p2.y-p1.y) ); } Point p1 = new Point(21.28, 49.32); Point p2 = new Point(81.12, 37.93); double dist = Point.Distance(p1, p2);
17 int lastID = User.GetLastID(); Статические поля данных class User { private int id; private string name; private static int idCounter = 0; public User() { id = ++idCounter; } public static int GetLastID() { return idCounter; }
18 -вызывается автоматически -не может получать параметры -объявляется без модификатора доступа Статический конструктор class User { private int id; private string name; private static int idCounter; public User() { id = idCounter++; } static User() { idCounter = DBase.GetUserLastID(); }
19 static class Math { public static int Sqr(int x) { return x * x; } public static double Div(int a, int b) { return a / b; } class Program { static void Main() { int a = Math.Sqr(10); double b = Math.Div(1, 5); } Статический класс Актуален когда: 1.Все методы статические. 2.Создание объектов не нужно. Не может содержать instance- методов
Константы public const int millenium = 2000; // времени компиляции public readonly int currentYear; // времени выполнения Константы (времени компиляции): только примитивные типы, перечисления и строки. Инициализация при объявлении, только вычисленными значениями. Являются неявно-статическими полями класса. Неизменяемые поля (константы времени выполнения): объявляются только в теле класса, инициализируются в теле класса или в конструкторе. Могут инициализироваться выражением.
class Foo { public const float PI = 3.14f; } class Program { static void Main() { Console.WriteLine(Foo.PI); // Доступ к статическому полю напрямую } // через имя класса }
class Polynom { private readonly int size; private double[] array; public Polynom(int sz) { size = sz; array = new double[sz]; } class Program { static void Main() { Polynom poly = new Polynom(5); }
class Polynom { private readonly int size; private double[] array; public Polynom(int sz) { size = sz; array = new double[sz]; } public void Foo() { size = 1; }
class Student { private string name; private int age = 0; public void SetName(string name) { this.name = name; } public void SetAge(int age) { this.age = age; } public string GetName() { return name; } public int GetAge() { return age; } Свойства (properties)
class Student { private string name; private int age; public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { if (value >= 0) age = value; }
Краткое объявление свойств class Student { public string Name { get; set; } public int Age { get; set; } }
class Student { public string Name { get; private set; } public int Age { get; private set; } }
Инициализация свойств при создании объекта Student s = new Student {Name = "Иванов И.И.", Age = 20};