Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Классы и объекты на c#. Свойства объектов.
1) Запись классов и объектов
2) Несколько классов
3) Массивы объектов
4) Присваивание объектов
5) Структуры
6)Массивы вспомогательных объектов
7) Передача аргументов методов, перегрузка функций
8) Указатель (ссылка) на объект, вызывающий метод - this
9) Перегрузка операторов
10) Статические поля и методы
11) Конструкторы инициализации
12) Делегаты на C#
1) Запись классов и объектов на c#
Создать новое консольное приложение.
Проект - добавить класс
имя: Record
создан файл Record.cs
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace ConsoleApplication1
{
class Record
{
}
}
В C# кроме полей и методов имеются свойства (property) для задания доступа к private
полям.
работа со свойствами
Record.cs
1
namespace ConsoleApplication1
{
class Record
{
private int min;
private int sec; // поле
public int Sec
// свойство
{
get
{
return sec;
}
set
{
if (value >= 0 && value < 60)
{
sec = value;
}
}
}
}
}
Program.cs
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Record a=new Record();
// как в java инициализация
a.Sec = 26;
// set - вызов метода у свойства
a.Sec=72;
// не присвоилось осталось прежнее 26
int b;
b = a.Sec;
// get - вызов метода у свойства
}
}
}
Добавление методов, полный пример класса Record.
Record.cs
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace ConsoleApplication1
{
class Record
{
private int min;
private int sec;
lic int Sec
2
{
get
{
return sec;
}
set
{
if (value >= 0 && value < 60)
{
sec = value;
}
}
}
public void Init(int m,int s)
{
min=m;
sec=s;
}
public void Display()
{
string s, s1;
s1 = Convert.ToString(min);
s = "min: "+s1 + " ";
s1 = Convert.ToString(sec);
s = s + "sec:" + s1;
Console.WriteLine(s);
}
public void Read()
{
string s="";
s= Console.ReadLine();
string[] s1;
s1 = s.Split(new char[] { ' ', '\t' },
StringSplitOptions.RemoveEmptyEntries);
min = Convert.ToInt32( s1[0]);
sec = Convert.ToInt32(s1[1]);
}
public int Numbersec()
{
return min * 60 + sec; // число секунд
}
public Record Add(Record a, Record b) // сложение 2 Record
{
Record c;
c = new Record();
c.min = a.min + b.min;
c.sec = a.sec + b.sec;
if (c.sec >= 60)
{
c.min++;
c.sec = c.sec - 60;
}
return c; // результат тип Record
}
}
}
Program.cs
3
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Record a=new Record();
a.Sec = 26;
a.Sec = 72; // не присвоилось a.sec=26 прежнее значение
int k;
k = a.Sec; // k=26
Record b = new Record();
b.Init(2, 10); // 2 min, 10 sec
b.Display();
Record c = new Record();
c.Read();
c.Display();
k = b.Numbersec();
Console.WriteLine("{0}", k);
Record d = new Record();
d = a.Add(b, c);
d.Display();
Console.ReadKey();
}
}
}
2) Несколько классов на C#
Record.cs
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace ConsoleApplication1
{
4
class Record
{
private int min, sec;
public void Init(int m, int s)
{
min = m;
sec = s;
}
public void Display()
{
string s, s1;
s1 = Convert.ToString(min);
s = "min: " + s1 + " ";
s1 = Convert.ToString(sec);
s = s + "sec:" + s1;
Console.WriteLine(s);
}
public int Numbersec()
{
return min * 60 + sec; // число секунд
}
public Record Add(Record a, Record b) // сложение 2 Record
{
Record c;
c = new Record();
c.min = a.min + b.min;
c.sec = a.sec + b.sec;
if (c.sec >= 60)
{
c.min++;
c.sec = c.sec - 60;
}
return c; // результат тип Record
}
}
}
Sportsman.cs
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace ConsoleApplication1
{
class Sportsman
{
private string fam; // фамилия
public string Fam
// свойство
{
get
{
return fam;
}
}
5
private Record r1 = new Record();
private Record r2 = new Record();
// первый результат
// второй результат
public void Init(string f, int m1, int s1, int m2, int s2)
{
fam = f;
r1.Init(m1, s1); // задание значений 1 результата
r2.Init(m2, s2); // задание значений второго результата
}
public void Display()
{
string s;
s = "Фамилия: " + fam;
Console.WriteLine(s);
Console.Write("первый результат: ");
r1.Display();
Console.Write("второй результат: ");
r2.Display();
}
public Record Sumrez()
{
return r1.Add(r1,r2);
}
// вывод фамилии
// вывод 1 результата
// вывод 2 результата
// возвращает суммарный результат Record (r1+r2)
public Sportsman Better(Sportsman a, Sportsman b) // лучший из 2 спортсменов
{
int k1, k2;
k1 = a.r1.Numbersec() + a.r2.Numbersec(); // общее число секунд первого
k2 = b.r1.Numbersec() + b.r2.Numbersec();// общее число секунд второго
if (k1 < k2)
return a;
else
return b;
}
}
}
Program.cs
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Sportsman P1,P2,P3;
P1 = new Sportsman();
P2 = new Sportsman();
P3 = new Sportsman();
P1.Init("Иванов", 2, 56, 3, 12);
6
P1.Display();
// вывод информации P1
P2.Init("Петров", 2, 48, 3, 19);
P3=P3.Better(P1,P2);
// P3 - лучший из P1, P2
string s;
s = P3.Fam;
// s - фамилия лучшего
Console.WriteLine("Спортсмен " + s + " лучше");
Record r;
r = P3.Sumrez();
// Record r - сумма 2 результатов P3
Console.WriteLine("Его результат:");
r.Display();
Console.ReadKey();
}
}
}
3) Массивы объектов на C#
Массивы объектов аналогичны java
Record[] ms;
ms = new Record[5];
int i;
for(i=0;i<5;i++)
{
ms[i] = new Record(); // инициализация каждого элемента
}
for (i = 0; i < 5; i++)
{
ms[i].Init(1, i);
}
int[] c = new int[5];
for (i = 0; i < 5; i++)
{
c[i] = ms[i].Numbersec();
}
for (i = 0; i < 5; i++)
{
Console.WriteLine(Convert.ToString(c[i]));
}
4) Присваивание объектов на c#
На c# объекты — ссылки при присваивании получаются одинаковые адреса
class Record
{
7
(1)
private int min;
private int sec;
public void Init(int m,int s)
{
min=m;
sec=s;
}
public void Display()
{
string s, s1;
s1 = Convert.ToString(min);
s = "min: "+s1 + " ";
s1 = Convert.ToString(sec);
s = s + "sec:" + s1;
Console.WriteLine(s);
}
}
static void Main(string[] args)
{
Record c, d;
c = new Record();
d = new Record();
c.Init(3, 5);
d.Init(4, 6);
c = d;
d.Init(7, 8);
d.Display();
c.Display();
min: 7 sec: 8
min: 7 sec: 8
// как с указателями на c++ и ссылками на java
5) Структуры на c#
Структура на c # аналогична классам на c++ . Объекты структуры не являются ссылками.
При присваивании копируются поля.
struct Record
{
private int min, sec;
public void Init(int m, int s)
{
min = m;
sec = s;
}
public void Display()
{
string s, s1;
s1 = Convert.ToString(min);
s = "min: " + s1 + " ";
s1 = Convert.ToString(sec);
s = s + "sec:" + s1;
8
Console.WriteLine(s);
}
}
class Program
{
static void Main(string[] args)
{
Record c,d;
c = new Record();
d = new Record();
c.Init(3, 5);
d.Init(4, 6);
c = d;
d.Init(7, 8);
// у c прежние значения, c,d - различные объекты
d.Display();
c.Display();
Console.ReadKey();
}
}
}
min: 7 sec: 8
min: 4 sec: 6 // !!!
// как с обычными объектами на c++
Структуры не являются ссылками и их можно не инициализировать new.
public int min, sec;
...........................
Record c;
c.min = 3;
c.sec = 4;
c.Init(3, 5);
c.Display();
min: 3 sec:5
Если записать:
private int min, sec;
....................
Record c;
c.Init(3,5); // ошибка компиляции c - не задано значение,
// хотя у структур min=0 sec=0 при определении Record c;
6)Массивы вспомогательных объектов на C#
Замена полей объектов вспомогательных классов массивом объектов вспомогательных
классов
C#
9
Record.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
private int min, sec;
public void Init(int m, int s)
{
min = m;
sec = s;
}
public void Display()
{
string s, s1;
s1 = Convert.ToString(min);
s = "min: " + s1 + " ";
s1 = Convert.ToString(sec);
s = s + "sec:" + s1;
Console.WriteLine(s);
}
}
}
Sortsman.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Sortsman
{
const int N=20;
private string fam;
private Record[] records = new Record[N]; // массив результатов (не более N)
int n;
public void Init(string f)
{
fam = f;
10
n = 0; // для нового спортсмена результатов нет
}
public void AddResult(int m, int s) // добавка результата в конец массива
{
Record c=new Record();
c.Init(m, s);
records[n] = c;
n++;
}
public void Display()
{
int i;
Console.WriteLine(fam);
for (i = 0; i < n; i++)
// вывод всех результатов
{
records[i].Display();
}
}
public void Insert(int k,int m,int s) // вставка результата на место k
{
int i;
for(i=n;i>k;i--)
{
records[i] = records[i - 1];
}
Record c=new Record();
c.Init(m, s);
records[k] = c;
n++;
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Sortsman a = new Sortsman();
11
a.Init("Иванов");
a.AddResult(3, 5);
a.AddResult(3, 6);
a.AddResult(3, 7);
a.AddResult(3, 8);
a.AddResult(3, 9);
a.Insert(2, 4, 1);
a.Display();
Console.ReadKey();
}
}
}
7) Передача аргументов методов на C# перегрузка функций
На C# имеется 2 типа возвращаемого параметра ref и out.
Вариант с out
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
private int min, sec;
public void Init(int m, int s)
{
min = m;
sec = s;
}
public int Numbersec()
12
{
return min * 60 + sec;
}
public void Numbersec(out int k) // out - возвращаемый параметр
{
k = min * 60 + sec;
}
}
class Program
{
static void Main(string[] args)
{
int k, m, n;
Record a = new Record();
a.Init(2, 10);
m = a.Numbersec(); // m=130
a.Numbersec(out n); // n=130 при вызове out указывается
}
}
}
Вариант с ref
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
private int min, sec;
public void Init(int m, int s)
{
min = m;
sec = s;
}
public int Numbersec()
{
return min * 60 + sec;
}
public void Numbersec(ref int k) // возвращаемый параметр ref
{
k = min * 60 + sec;
}
13
}
class Program
{
static void Main(string[] args)
{
int k, m, n;
Record a = new Record();
a.Init(2, 10);
m = a.Numbersec();
n = 1;
// ! перед вызовом ref параметр должен иметь значение
a.Numbersec(ref n); // ref при вызове указывается
a.Numbersec(ref k); // ! ошибка k – не задано значение
}
}
}
Вариант не работает out
public void Numbersec(ref out k) // возвращаемый параметр ref
{
if(k<0) // ! ошибка компиляции. При проверке k должен быть задан
k=0;
else
k = min * 60 + sec;
}
8) Указатель (ссылка) на объект, вызывающий метод - this
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
private int min, sec;
public void Init(int m, int s)
{
min = m;
sec = s;
}
public Record add(Record a, Record b) // с двумя аргументами
{
Record c = new Record();
c.min = a.min + b.min;
14
c.sec = a.sec + b.sec;
if (c.sec >= 60)
{
c.min++;
c.sec -= 60;
}
return c;
}
public Record add(Record b) // с одним аргументом
{
Record c = new Record();
c.min = this.min + b.min;
c.sec =this.sec + b.sec;
if (c.sec >= 60)
{
c.min++;
c.sec -= 60;
}
return c;
}
}
class Program
{
static void Main(string[] args)
{
int k, m, n;
Record a = new Record();
Record b = new Record();
Record c = new Record();
a.Init(2, 10);
b.Init(2, 57);
c = c.add(a, b); // можно c=a.add(a,b); c=a+b c: 5 7
c = a.add(b); // c=a+b c: 5 7
}
}
}
9) Перегрузка операторов на C#
Перегрузка бинарных операторов выполняется методом класса с двумя аргументами,
унарных с одним аргументом.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
15
namespace ConsoleApplication1
{
class Record
{
private int min, sec;
public void Init(int m, int s)
{
min = m;
sec = s;
}
public static Record operator +(Record a, Record b) // Record+Record
{
Record c;
c = new Record();
c.min = a.min + b.min;
c.sec = a.sec + b.sec;
if (c.sec >= 60)
{
c.min++;
c.sec = c.sec - 60;
}
return c;
}
public static Record operator +(Record a, int b) // Record+int
{
Record c;
c = new Record();
c.min = a.min;
c.sec = a.sec + b;
if (c.sec >= 60)
{
c.min++;
c.sec = c.sec - 60;
}
return c;
}
public static Record operator +(int a, Record b) // int+Record
{
Record c;
c = new Record();
c.min = b.min;
c.sec = a + b.sec;
16
if (c.sec >= 60)
{
c.min++;
c.sec = c.sec - 60;
}
return c;
}
public static Record operator ++(Record x) // ++ один префикс и постфикс!
{
++x.min;
return x;
}
}
class Program
{
static void Main(string[] args)
{
int k, m, n;
Record a = new Record();
Record b = new Record();
Record c = new Record();
a.Init(3, 56);
b.Init(4, 13);
c.Init(5,10);
c = a + b;
// c: min=8 sec=9
c = c + 50; // c: min=8 sec=59
c = 10 + c; // c: min=9 sec=9
a = a + b + 10; // a: min=8 sec=19
a.Init(3, 5);
b = a++;
// b: min=4 sec=5
a.Init(3, 5);
b = ++a;
// b: min=4 sec=5 тоже самое, при присваивании b и a указывают на
// ту же память
}
}
}
10) Статические поля и методы на C#
Статические (static) поля и методы вызываются не объектами, а классами, они принадлежат
классу целиком.
Статическое поле имеет одно и тоже значение для всех объектов C++, инициализируется
один раз вне функции и если объект изменит его значение, оно изменится для всех объектов.
Статические методы могут обращаться только к статическим полям и методам.
Пример статического поля и метода в C#
17
Марафонский бег - к min, sec в Record добавлено статическое поле hour (час). Кроме этого
добавлен статический метод Roundmin – округление до минут.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
private int min, sec;
public static int hour;
public void Init(int m, int s)
{
min = m;
sec = s;
}
// статическое поле
static public int Roundmin(Record x) // статический метод
{
if (x.sec >= 30)
{
return x.min + 1;
}
else
{
return x.min;
}
}
}
class Program
{
static void Main(string[] args)
{
Record a = new Record();
Record b = new Record();
a.Init(3, 5);
b.Init(2, 45);
Record.hour = 2; // вызов статического поля через класс!
int z;
z = Record.Roundmin(b); // вызов статического метода z=3
}
}
18
}
11) Конструкторы инициализации на C#
Конструкторы – специальные методы класса, имя конструктора совпадает с именем
класса и отсутствует тип, в том числе void, вызываются при инициализации объектов.
Конструкторы могут быть с числом параметров, равным числу полей, меньшим числом
параметров или без параметров. Конструкторов может быть несколько (перегрузка!)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
private int min, sec;
public Record(int m, int s) // с двумя параметрами
{
min = m;
sec = s;
}
public Record(int m) // с одним параметром
{
min = m;
sec = 0;
}
public Record() // без параметров
{
min = 0;
sec = 1;
}
~Record() // деструктор, вызывается перед сборкой мусора, т.е. неизвестно когда
{
Console.WriteLine("Объект {0} {1} уничтожен", min,sec);
}
class Program
{
static void Main(string[] args)
{
Record a = new Record(3,5);
Record b = new Record(2);
19
Record c = new Record();
Record []d =new Record[5];
int i;
for (i = 0; i < 5; i++)
{
d[i] = new Record(i); // конструктор с одним параметром
}
}
}
}
12) Делегаты на C#
Делегат – объект для вызовов методов с одинаковыми аргументами и возвращаемым типом
(одинаковой сигнатурой).
Пример.
В проекте калькулятор целых чисел имеется ряд вычислительных методов, у всех 2
аргумента целого типа и они возвращают целое число. Объявлен делегат для работы с
указанными методами.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static int Add(int a, int b)
{
return a + b;
}
static int Sub(int a, int b)
{
return a - b;
}
static int Mult(int a, int b)
{
return a * b;
}
20
static int Div(int a, int b)
{
return a / b;
}
public delegate int Calc(int a, int b); // делегат Calc для вычислений
static void Main(string[] args)
{
Calc A = Add; // A экземпляр делегата для сложения
int Result;
Result = A(4, 6); // вызов метода сложения Result=10
Calc S = Sub;
// B экземпляр делегата для вычитания
Result = S(6, 2); // вызов метода сложения Result=14
A = Mult;
// теперь A для умножения
Result = A(3, 5); // вызов метода умножения Result=15
S = Add;
S+=Mult; // операции над делегатами
S-=Mult;
}
}
}
21