Добро пожаловать на мой блог

The world is yours

C#\Console

автор: admin | Октябрь 14, 2010 | Раздел: Программирование

Архитектура microsoft.net

  1. .NET framework – часть microsoft.net предназначена для разработки программного обеспечения.Состоит из 2-х основыных частей:
  2. Среда исполнения программ
  3. Библиотеки классов.

CLR – Common language runtime – центральная часть каркаса  .NET

Общеязыковая исполняющая среда:

Компиляция кода,выделения памяти, сборщик мусора.

BSL(FCL) base class library or framework base library.

WPF- windows presentation foundation.

WCF- windows communication foundation

WF – windows workflow

Компиляция .NET  2 шага:

  1. Исходные тексты программ компилируется специальными промежуточноми представлениями

IL- Microsoft Intermedia language.

  1. Промежуточное представление компилируется в специфичный для платформы код.

CTS – Common type system – Общие системные типы.

CLS – Common language specification – общая спецификация языка- это набор минимальных стандартов которых должны придерживатся все компиляторы ориентированные на .net языки.

Сборка – это коллекция файлов или один файл, который предстает перед программистом в виде библиотеке динамической компоновки или исполняемого файла, содержащая скомпилированный код для .net framework.

Структура сборки:

  1. метаданные сборки
  2. Метаданные типов
  3. IL code
  4. ресурсы

Типы сборков:

  1. приватные сборки – поставляются с определенным ПО предназначены только для использования в его составе.
  2. разделяемые сборки – библиотека общего применения которые могут использоваться любыми приложениями, размещаются они в специальном системном каталоге GAC – Global Assembly Cache.

Типы языка C#:

1.Значимые типы – переменные значимого типа создаются в стеке, значения переменной является неотъемлемой собственностью переменной.

2. Ссылочные типы – для ссылочных типов значением служит ссылка на некоторый объект, расположенный обычно в динамической памяти. Этот объект может быть разделяемым (много ссылок на один объект).

Object ob=null;

Ob=new object;

Значимыми типами являются:

  1. Логический тип
  2. Арифметические типы

3.Структуры

4.Перечисления

Ссылочные типы:

1.Массивы

2.Строки

3.Классы

Тип значения (value type) Ссылочный тип (reference type)
Содержимое хранит непосредственно данные хранит ссылку на значение
Размещение стек управляемая куча
Освобождение памяти Сразу по завершению метода, в котором объявлена переменная При сборке муслора
Объявление struct или enum class
Наследование Структурные типы наследуются от ValueType,

перечисления – от Enum

Не может выступать в роле базового класса

System.Object или производные от него классы
Присвоение Когда переменной значимого типа присваивается другая переменная  значимого типа, выполняется копирование всех ее полей Когда переменной  ссылочного типа присваивается переменная ссылочного типа, копируется только

ее адрес

Конфликты областей видимости локальных переменных

static void Main(string[] args)

{

int i = 30;

int i = 100;

}

Error    1          A local variable named ‘i’ is already defined in this scope

static void Main(string[] args)

{

int i = 10;

for (int i = 0; i < 5; i++)

Console.WriteLine(i);

}

Error    1          A local variable named ‘i’ cannot be declared in this scope because it would give a different meaning to ‘i’, which is already used in a ‘parent or current’ scope to denote something else

for (int i = 0; i < 5; i++)

Console.WriteLine(i);

Console.WriteLine(i);

Error    1          The name ‘i’ does not exist in the current context

static void Main(string[] args)

{

for (int i = 0; i < 5; i++)

{

Console.WriteLine(i);

}

int i = 100;

}

Error    1          A local variable named ‘i’ cannot be declared in this scope because it would give a different meaning to ‘i’, which is already used in a ‘child’ scope to denote something else

static void Main(string[] args)

{

for (int i = 0; i < 5; i++)

{

for (int i = 0; i < 5; i++)

{

Console.WriteLine(i);

}

Console.WriteLine(i);

}

}

Error    1          A local variable named ‘i’ cannot be declared in this scope because it would give a different meaning to ‘i’, which is already used in a ‘parent or current’ scope to denote something else

public class Test

{

static int i = 20;

static void Main(string[] args)

{

int i = 30;

Console.WriteLine(i);

Console.WriteLine(Test.i);

}

}

30

20

System.valueType- Значимый

System.object – ссылочный

Методы класса system.object который является общим родителем всех типов:

  1. bool equals (Object ob) –проверяет эквивалентность текущего объекта и объекта передаваемого в параметре.
  2. System.Type GetType() – системный тип текущего объекта
  3. string ToString() – из числа делает строку
  4. int GetHashCode() –возвращает код который используется в алгоритме поиска.

Методы структурных типов (значимых):

Type Parse (string str) – принимает строку и возвращает соответствующее по типу значение. Int a =int.Parse(“123”);

Bool TryParse(string str, out type res)

Int?a=null;

If(a===null)

Задача: Определить в программе класс и структуру которые содержат, по одному открытому целочисленному полю.В мэйне создать по одному объекту структуры и класса. В поля объекта структуры и класса установить значение. Вывести содержимое первого и второго объекта.Создать копии обоих экземпляров.Изменить значение и опять вывести.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

struct MyStruct

{

public int a;

}

class MyClass

{

public int a;

}

class Program

{

static void Main(string[] args)

{

MyClass c=new MyClass();

c.a = 10;

MyStruct s;

s.a = 10;

Console.WriteLine(“c.a={0}ns.a={1}”,c.a,s.a);

MyClass c2 = c;//копия

MyStruct s2 = s;//копия

Console.WriteLine(“c2.a={0}n s2.a={1}”, c2.a, s2.a);

c.a = 20;

s.a = 30;

Console.WriteLine(“c.a={0}n s.a={1}”, c.a, s.a);

Console.WriteLine(“c2.a={0}n s2.a={1}”, c2.a, s2.a);

}

}

}

Упаковка(Boxing) выполняет преобразование значимого типа в ссылочного выполняется при копировании значимых переменных  в объектные ссылки, при передаче в методы по значению.

Short a=23;

Object ob;

  1. В куче выделяется память после анализа размера переменной значимого типа.
  2. Поле значимого типа копируется в память.
  3. Возвращается адрес объекта и записывается в ссылку.

Распаковка (UnBoxing) – преобразование ссылочного типа в значимый.short b (short)ob;

БЕЗОПАСНОЕ ПРЕОБРАЗОВАНИЕ:

  1. Безопасное приведение является расширяющее преобразование.

Int32 q=23;

Int 64 b=q;

2.Когда переводится тип объекта к его базовому типу

Shortq=24;

Object ob;

For each:

Int[]a={1,2,3};

Foreach(int I//счетчик in a//коллекция)

{

….i…

}

Byte b = 200;

b =checked((Byte)(b + 100));

Console.WriteLine(b);

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

int a, b;

a =int.Parse(Console.ReadLine());

b = Convert.ToInt32(Console.ReadLine());

int i = a + b;

Console.WriteLine(i);

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

Console.CursorVisible = false;

string b = “Hello C# ;) ”;

Console.SetWindowSize(25, 25);

Console.SetCursorPosition(5, 5);

Console.BackgroundColor = System.ConsoleColor.DarkGreen;

Console.ForegroundColor = System.ConsoleColor.Green;

Console.WriteLine(b);

b=Console.ReadLine();

Console.Beep();

}

}

}

///////////////////////////////////////////

Homework

Test 1; Практика_C_Sharp_osnovy

Класс math

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LOGAN

{

class Program

{

static void Main(string[] args)

{

double p;

p = double.Parse(Console.ReadLine());

Console.WriteLine(p);

}

}

}

Основы классов C#

  1. Const
  2. static
  3. Readonly
  4. Metods
  5. Параметры методов

[аттрибут][идентификаторы_доступа]

Class name_class[:список базовых типов]

{

//тело класса

}

Компоненты класса C#:

  1. Константы- идентификатор который определяет некую величину, константны всегда неявно статические.
  2. Поле класса – представляет неизменяемое или изменяемое значение которое существует на уровне экземпляра.
  3. Конструкторы
  4. Конструкторы типа
  5. Метод
  6. Перегруженные операторы
  7. Свойства- механизм для получения получения или установки типа или объекта.
  8. События – механизм который позволяет типу посылать уведомления слушающему типу или объекту.

Модификаторы доступа к члену класса

Модификатор C# Модификатор CLR Описание
private Private Доступен только методам в определяющем типе и вложенных в него типах
protected Family Доступен только методам в определяющем типе (и вложенных в него типах) или одном из его производных типов независимо от сборки
internal Assembly Доступен только методам в определяющей сборке
protected internal Family or Assembly Доступен только методам в определяющем типе (и вложенных в него типах) или одном из его производных типов только в пределах сборки
public Public Доступен всем методам во всех сборках

Доступность или видимость членов класса

Члены класса должны определять свой уровень доступности. Если он явно не определён, он по умолчанию определяется как private.

Пример

using System;

public class SomeType

{

//доступен отовсюду

public void PublicMethod()

{ }

//доступен только из типов SomeClass

private void PrivateMethod()

{ }

//доступен из Somelass и потомков

protected void ProtectedMethod()

{ }

//доступен только в рамках данной сборки

internal void InternalMetod()

{ }

//защищёный доступ внутри сборки

protected internal void ProInMethod() { }

//по умолчанию приватный

void SomeMethod()

{ }

//если мы определим метод Main() внутри этого же класса

public static void Main()

{

SomeType obj = new SomeType();

obj.PublicMethod();

obj.InternalMetod();

obj.ProInMethod();

obj.PrivateMethod();

obj.SomeMethod();

obj.ProtectedMethod();

}

}

//если мы определим метод Main() в другом классе,

//не производном от класса SomeType

public class OtherClass

{

public static void Main()

{

SomeType obj = new SomeType();

obj.PublicMethod();

obj.InternalMetod();

obj.ProInMethod();

obj.PrivateMethod();//Error

obj.SomeMethod(); //Error

obj.ProtectedMethod(); //Error

}

}

// Это открытый тип

public class ThisIsAPublicType { … }

// Это внутренний тип

internal class ThisIsAnlnternalType { … }

// Это внутренний тип, так как модификатор доступа не указан явно,

class ThisIsAlsoAnlnternalType { … }

Модификаторы, применяемые к полям

Термин C# Термин CLR
static Static Поле является частью состояния типа, а не объекта
по умолчанию Instance Поле связано с экземпляром типа, а не самим типом
readonly InitOnly Запись в поле разрешается только из кода метода конструктора
volatile Volatile

using System;

public class Person

{

private int age;

private string name, address;

private bool married;

}

Поле может быть любого типа.

Public My( int x):this(x,10)

{}

Правило определения и использования констант,

  1. Константа –это переменная значения которой устанавливается при этапе компиляции.

using System;

using System.Collections.Generic;

using System.Text;

namespace Constants

{

static class ConstData

{

// The value of a const must be known at compile

// time.

public const string BestNbaTeam = “Timberwolves”;

public const double SimplePI = 3.14;

public const bool Truth = true;

public const bool Falsity = !Truth;

}

class Program

{

public const string BestNhlTeam = “Wild”;

static void Main(string[] args)

{

Console.WriteLine(“***** Fun with Constants *****”);

// Print const values defined by other type.

Console.WriteLine(“Nba const: {0}”, ConstData.BestNbaTeam);

Console.WriteLine(“SimplePI const: {0}”, ConstData.SimplePI);

Console.WriteLine(“Truth const: {0}”, ConstData.Truth);

Console.WriteLine(“Falsity const: {0}”, ConstData.Falsity);

// Print member level const.

Console.WriteLine(“Nhl const: {0}”, BestNhlTeam);

// Print local-scoped const.

const int LocalFixedValue = 4;

Console.WriteLine(“Local const: {0}”, LocalFixedValue);

Console.ReadLine();

}

}

}

Class My

{

Private int a;

Const int b;

Public ReadOnly int c;

}

Характеристики полей только для чтения:

  1. Обозначается ключевым словом ReadOnly
  2. переменная не может быть изменена

Но может быть проинициализирована в конструкторе.

Private int a;

Public void SetA(int a)

{

This.a=a;

}

Модифакаторы

Передача параметров в методы классов выполняются посредством трех способов:

  1. По значению public void f(int a,int b){a++;b++;}int x=10;int y=20;f(x,y);

Для параметра значимого типа, для передачи в метод создается его копия,

При изменении его копии значения параметра не изменяется.

——

Public void the(mya,myb)

{

a+;b++;

}

Myx=new My();

Myy= new My();

The (x,y);

Для передачи ссылочного типа для передачи в метод создается копия ссылки, метод может использовать эту ссылку для изменения состояния объекта.

  1. Передача по ссылке с помощью модификатора REF:

Для параметров с модификатором REF

Вызывающий код должен обязательно инициализировать параметр перед передачей в метод, вызванный метод может как и читать так и записывать в значения параметров.

Public void some(ref int a,ref int b)

{

a++;b++;

}

Int x=10;int y=10;

Some(ref x,ref y);

  1. Передача по ссылке с помощью модификатора Out:

Вызывающий код может не инициализировать параметр, перед передачей его в метод. Вызванный метод не может читать значения параметра. И должен обязательно его инициализировать.

Void f1(out int a)

{

A=10;

}

Int b;

F1(out);

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _27may

{

struct MyStruct

{

public int age;

public string name;

}

class MyClass

{

public int age;

public string name;

}

class Program

{

static void SetMyStruct(ref MyStruct s)

{

s.age = 25;

s.name = “Juli”;

}

static void SetMyClass(MyClass c)

{

c.age = 18;

c.name = “Jenia”;

}

static void Main(string[] args)

{

MyStruct MS =new MyStruct();//конструктор вызывается для инициализации

MyClass MC = new MyClass();

SetMyClass(MC);

SetMyStruct(ref MS);

Console.WriteLine( MS.name);

Console.WriteLine( MS.age);

Console.WriteLine(MC.name);

Console.WriteLine(MC.age);

}

}

}

3.Модификатор Params – применяется к последнему параметру метода, Должен представлять собой одномерный массив любого типа.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Person

{

private int age;

private string name;

public override string ToString()

{

string s;

s = “Name:” + name + “nAge:” + age.ToString();

return s;

}

public Person(string n, int a)

{

name = n;

age = a;

}

public override bool Equals(object obj)

{

if (name == ((Person)obj).name && age == ((Person)obj).age)

return true;

else return false;

}

}

class Program

{

static void Main(string[] args)

{

Person p = new Person(“Alina”, 28);

Person p2 = new Person(“Alina”, 28);

Console.WriteLine(p.ToString());

if (p.Equals(p2)) Console.WriteLine(“TRUE”);

else Console.WriteLine(“FALSE”);

}

}

}

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

#endregion

namespace DataTypes

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine(“***** Data Types *****”);

// 12 is-a System.Int32 which is-a System.ValueType

// which is-a System.Object.

Console.WriteLine(12.GetHashCode());

Console.WriteLine(12.Equals(23));

Console.WriteLine(12.GetType().BaseType);

Console.WriteLine(12.ToString());

Console.WriteLine(12); // ToString() called automatically.

//////////////////////////////////////////////////////////////////////////////

// Exercise a ushort.

Console.WriteLine(“n***** Fun with unsigned shorts *****”);

System.UInt16 myUInt16 = 30000;

Console.WriteLine(“Max for an UInt16 is: {0} “, UInt16.MaxValue);

Console.WriteLine(“Min for an UInt16 is: {0} “, UInt16.MinValue);

Console.WriteLine(“Value is: {0} “, myUInt16);

Console.WriteLine(“I am a: {0} “, myUInt16.GetType());

// Now in System.UInt16 shorthand (e.g. a ushort).

ushort myOtherUInt16 = 12000;

Console.WriteLine(“Max for an UInt16 is: {0} “, ushort.MaxValue);

Console.WriteLine(“Min for an UInt16 is: {0} “, ushort.MinValue);

Console.WriteLine(“Value is: {0} “, myOtherUInt16);

Console.WriteLine(“I am a: {0} “, myOtherUInt16.GetType());

Console.WriteLine(“n***** Fun with doubles *****”);

Console.WriteLine(“-> double.Epsilon: {0}”, double.Epsilon);

Console.WriteLine(“-> double.PositiveInfinity: {0}”, double.PositiveInfinity);

Console.WriteLine(“-> double.NegativeInfinity: {0}”, double.NegativeInfinity);

Console.WriteLine(“-> double.MaxValue: {0}”, double.MaxValue);

Console.WriteLine(“-> double.MinValue: {0}”, double.MinValue);

/////////////////////////////////////////////////////////////////////////////////

Console.WriteLine(“n***** Fun with bools *****”);

// No more ad-hoc Boolean types in C#!

// bool b = 0;        // Illegal!

// bool b2 = -1;      // Also illegal!

bool b3 = true;    // No problem.

bool b4 = false;   // No problem.

Console.WriteLine(“-> bool.FalseString: {0}”, bool.FalseString);

Console.WriteLine(“-> bool.TrueString: {0}”, bool.TrueString);

//////////////////////////////////////////////////////////////////////////////////

// Test the truth of the following statements…

Console.WriteLine(“n***** Fun with chars *****”);

Console.WriteLine(“-> char.IsDigit(‘K’): {0}”, char.IsDigit(‘K’));

Console.WriteLine(“-> char.IsDigit(‘9′): {0}”, char.IsDigit(‘9′));

Console.WriteLine(“-> char.IsLetter(‘10′, 1): {0}”, char.IsLetter(“10″, 1));

Console.WriteLine(“-> char.IsLetter(‘p’): {0}”, char.IsLetter(‘p’));

Console.WriteLine(“-> char.IsWhiteSpace(‘Hello There’, 5): {0}”,

char.IsWhiteSpace(“Hello There”, 5));

Console.WriteLine(“-> char.IsWhiteSpace(‘Hello There’, 6): {0}”,

char.IsWhiteSpace(“Hello There”, 6));

Console.WriteLine(“-> char.IsLetterOrDigit(‘?’): {0}”,

char.IsLetterOrDigit(‘?’));

Console.WriteLine(“-> char.IsPunctuation(‘!’): {0}”,

char.IsPunctuation(‘!’));

Console.WriteLine(“-> char.IsPunctuation(‘>’): {0}”,

char.IsPunctuation(‘>’));

Console.WriteLine(“-> char.IsPunctuation(‘,’): {0}”,

char.IsPunctuation(‘,’));

// Test the truth of the following statements…

Console.WriteLine(“n***** Fun with parsing *****”);

bool myBool = bool.Parse(“True”);

Console.WriteLine(“-> Value of myBool: {0}”, myBool);

double myDbl = double.Parse(“99″);

Console.WriteLine(“-> Value of myDbl: {0}”, myDbl);

int myInt = int.Parse(“8″);

Console.WriteLine(“-> Value of myInt: {0}”, myInt);

char myChar = char.Parse(“w”);

Console.WriteLine(“-> Value of myChar: {0}n”, myChar);

Console.WriteLine(“n***** Fun with DateTime *****”);

// This constructor takes (year, month, day)

DateTime dt = new DateTime(2004, 10, 17);

// What day of the month is this?

Console.WriteLine(“The day of {0} is {1}”, dt.Date, dt.DayOfWeek);

dt.AddMonths(2);  // Month is now December.

Console.WriteLine(“Daylight savings: {0}”, dt.IsDaylightSavingTime());

Console.WriteLine(“n***** Fun with TimeSpan *****”);

// This constructor takes (hrs, minutes, seconds)

TimeSpan ts = new TimeSpan(4, 30, 0);

Console.WriteLine(ts);

// Subtract 15 minutes from the current TimeSpan and

// print the result.

Console.WriteLine(ts.Subtract(new TimeSpan(0, 15, 0)));

Console.ReadLine();

}

}

}

String – конструктор

///////////////////////////////////////////

Список перегрузки

Имя     Описание

String(Char*)  Инициализирует новый экземпляр класса String значением, на которое указывает заданный указатель на массив знаков Юникода.

String(Char[]) Инициализирует новый экземпляр класса String значением, заданным в виде массива знаков Юникода.

String(SByte*)      Инициализирует новый экземпляр класса String значением, определенным указателем на массив 8-разрядных целых чисел со знаком.

String(Char, Int32)     Инициализирует новый экземпляр класса String значением, полученным путем повторения заданного знака Юникода заданное число раз.

String(Char*, Int32, Int32)    Инициализирует новый экземпляр класса String значением, которое определяется заданным указателем на массив знаков Юникода, начальной позицией знака в этом массиве и длиной.

String(Char[], Int32, Int32)    Инициализирует новый экземпляр класса String значением, заданным массивом знаков Юникода, начальной позицией знака в пределах данного массива и длиной.

String(SByte*, Int32, Int32)  Инициализирует новый экземпляр класса String значением, определяемым заданным указателем на массив 8-битовых целых чисел со знаком, позицией начального знака в пределах данного массива и длиной.

String(SByte*, Int32, Int32, Encoding)      Инициализирует новый экземпляр класса String значением, определенным заданным указателем на массив 8-разрядных целых чисел со знаком, начальной позицией знака в пределах данного массива, длиной и объектом Encoding.

Методы

////////////////////////////////////////////

Имя     Описание

Clone  Возвращает ссылку на данный экземпляр класса String.

Compare   Перегружен. Сравнивает два заданных объекта String и возвращает целое число, которое показывает их связь друг с другом в порядке сортировки.

CompareOrdinal   Перегружен. Сравнивает два объекта String, оценивая числовые значения соответствующих объектов Char в каждой строке.

CompareTo     Перегружен. Сравнивает данный экземпляр с заданным объектом или строкой String и возвращает целое число, которое показывает, расположен ли данный экземпляр перед, после или на той же позиции в порядке сортировки, что и заданный объект или строка String.

Concat Перегружен. Объединяет один или несколько экземпляров класса String или представления в виде String значений одного или нескольких экземпляров Object.

Contains    Возвращает значение, указывающее, равен ли данный экземпляр заданному объекту или значению типа String.

Copy   Создает новый экземпляр String, имеющий то же значение, что и заданный экземпляр String.

CopyTo     Копирует заданное число знаков начиная с указанной позиции в этом экземпляре до указанной позиции в массиве знаков Юникода.

EndsWith  Перегружен. Определяет, совпадает ли конец экземпляра String с указанной строкой.

Equals Перегружен. Определяет, равны ли значения двух объектов String.

Finalize     Позволяет объекту Object попытаться освободить ресурсы и выполнить другие операции очистки, перед тем как объект Object будет утилизирован в процессе сборки мусора. (Унаследовано от Object.)

Format Перегружен. Заменяет каждый элемент формата в указанном объекте String текстовым эквивалентом значения соответствующего объекта.

GetEnumerator     Извлекает объект, который может выполнять итерацию отдельных знаков данной строки.

GetHashCode  Возвращает хэш-код для этой строки. (Переопределяет Object.GetHashCode().)

GetType    Возвращает объект Type для текущего экземпляра. (Унаследовано от Object.)

GetTypeCode Возвращает TypeCode для класса String.

IndexOf     Перегружен. Возвращает индекс первого вхождения String или одного или нескольких знаков в данной строке.

IndexOfAny    Перегружен. Возвращает индекс первого обнаруженного в данном экземпляре знака из указанного массива знаков Юникода.

Insert   Вставляет указанный экземпляр String в данный экземпляр по заданному индексу.

Intern  Извлекает системную ссылку на указанный объект String.

IsInterned  Извлекает ссылку на указанный объект String.

IsNormalized  Перегружен. Указывает, находится ли данная строка в определенной форме нормализации Юникода.

IsNullOrEmpty     Указывает, является ли заданный объект String значением null или строкой Empty.

Join     Перегружен. Вставляет заданный разделитель типа String между элементами заданного массива String, создавая одну сцепленную строку.

LastIndexOf    Перегружен. Возвращает индекс последнего вхождения указанного знака Юникода или String в пределах данного экземпляра.

LastIndexOfAny   Перегружен. Возвращает индекс последнего вхождения в данном экземпляре какого-либо одного или нескольких знаков, указанных в массиве знаков Юникод.

MemberwiseClone      Создает неполную копию текущего объекта Object. (Унаследовано от Object.)

Normalize Перегружен. Возвращает новую строку, двоичное представление которой находится в определенной нормализованной форме Юникода.

PadLeft     Перегружен. Выравнивает знаки в данном экземпляре по правому краю, добавляя слева пробелы или указанные знаки Юникода до указанной общей длины.

PadRight   Перегружен. Выравнивает знаки в данной строке по левому краю, добавляя справа пробелы или указанные знаки Юникода до указанной общей длины.

Remove     Перегружен. Удаление заданного числа знаков из данного экземпляра.

Replace     Перегружен. Заменяет все вхождения указанного знака Юникода или String в данном экземпляре другим заданным знаком Юникода или String.

Split    Перегружен. Возвращает строковый массив, содержащий подстроки данного экземпляра, разделенные элементами заданной строки или массива знаков Юникода.

StartsWith Перегружен. Определяет, совпадает ли начало экземпляра String с указанной строкой.

Substring   Перегружен. Извлекает подстроку из данного экземпляра.

ToCharArray  Перегружен. Копирует знаки данного экземпляра в массив знаков Юникода.

ToLower   Перегружен. Возвращает копию этого объекта String, переведенную в нижний регистр.

ToLowerInvariant Возвращает копию этого объекта String, переведенную в нижний регистр, используя правила учета регистра инвариантного языка и региональных параметров.

ToString    Перегружен. Преобразует значение данного экземпляра в String.

ToUpper   Перегружен. Возвращает копию этого объекта String, переведенную в верхний регистр.

ToUpperInvariant Возвращает копию этого объекта String, переведенную в верхний регистр, используя правила учета регистра инвариантного языка и региональных параметров.

Trim    Перегружен. Удаляет все начальные и конечные вхождения заданных наборов знаков из текущего объекта String.

TrimEnd    Удаляет все конечные вхождения набора знаков, заданного в виде массива, из текущего объекта String.

TrimStart  Удаляет все начальные вхождения набора знаков, заданного в виде массива, из текущего объекта String.

Операторы

//////////////////////////////////////////////////

Имя     Описание

Equality    Определяет, равны ли значения двух указанных объектов String.

Inequality  Определяет, различаются ли значения двух указанных объектов String.

Методы расширения

//////////////////////////////////////////////////

Имя     Описание

Aggregate  Применяет к последовательности агрегатную функцию. (Определено в Enumerable.)

All Проверяет, все ли элементы последовательности удовлетворяют условию. (Определено в Enumerable.)

Any     Перегружен.

AsEnumerable Возвращает входные данные, приведенные к типу IEnumerable<T>. (Определено в Enumerable.)

AsQueryable   Перегружен.

Average     Перегружен.

Cast     Преобразовывает элементы объекта IEnumerable в заданный тип. (Определено в Enumerable.)

Concat Объединяет две последовательности. (Определено в Enumerable.)

Contains    Перегружен.

Count  Перегружен.

DefaultIfEmpty     Перегружен.

Distinct     Перегружен.

ElementAt Возвращает элемент по указанному индексу в последовательности. (Определено в Enumerable.)

ElementAtOrDefault  Возвращает элемент по указанному индексу в последовательности или значение по умолчанию, если индекс вне допустимого диапазона. (Определено в Enumerable.)

Except Перегружен.

First     Перегружен.

FirstOrDefault Перегружен.

Intersect    Перегружен.

Last     Перегружен.

LastOrDefault Перегружен.

LongCount      Перегружен.

Max     Перегружен.

Min     Перегружен.

OfType      Выполняет фильтрацию элементов объекта IEnumerable по заданному типу. (Определено в Enumerable.)

Reverse     Изменяет порядок элементов последовательности на противоположный. (Определено в Enumerable.)

SequenceEqual     Перегружен.

Single  Перегружен.

SingleOrDefault   Перегружен.

Skip    Пропускает заданное число элементов в последовательности и возвращает остальные элементы. (Определено в Enumerable.)

SkipWhile Перегружен.

Sum     Перегружен.

Take    Возвращает указанное число подряд идущих элементов с начала последовательности. (Определено в Enumerable.)

TakeWhile Перегружен.

ToArray    Создает массив из объекта IEnumerable<T>. (Определено в Enumerable.)

ToList Создает список List<T> из объекта IEnumerable<T>. (Определено в Enumerable.)

Union  Перегружен.

Where Перегружен.

Поля

/////////////////////////////////////////////////

Имя     Описание

Empty Представляет пустую строку. Это поле доступно только для чтения.

Свойства

//////////////////////////////////////////////////

Имя     Описание

Chars   Возвращает знак в указанной позиции в текущем объекте String.

Length Возвращает число знаков в текущем объекте String.

Массив в C#- набор или коллекция указателей на данные одного и того же типа.

Массивы всегда являются ссылочного типа, и получается всегда на основе класса system.array.

Все массивы в C# это динамические конструкции.Одномерные массивы в C#

Тип_данных[]имя_массива;

Инициализация массива:

Имя_массива=тип данных[]размер

Int [] MyMass;

MyMass = new int [10];

Объявления 2 мерных массивов в C#:

Тип_данных[,]имя;

Имя=new тип_д[r,c];

Int [,]M;

M= new int [3,4];

,,,,M[I,j]……

ДЗ: написать комментарии к каждой строке, из msdn.и вторую задачу,и еще задачи

Исключение – это объект который инкапсулирует информацию о необычном программном проишествии.

Типы Блоков обработки исключений:

1.Блок Try – он содержит код который требует очистки или восстановления после исключения.

2.catch – содержит код который Должен выполнятся при возникновении исключения.

3.Finally – Блок содержащий код очищающий любые ресурсы.

Это блок размещается всегда после catch иначе после try.

Если в блоке try не происходит исключение или происходит исключения но ни один из обработчиков catch не подходит, в любом случае будет выполнятся блок finally.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Program

{

public static double div(int a, int b)

{

return a / b;

}

static void Main(string[] args)

{

try

{

int x = 10;

int y = 0;

double z;

z = div(x, y);

}

catch(DivideByZeroException e )

{

Console.WriteLine(e.Message);

}

}

}

}

Определение собственных типов исключения:

  1. Этот класс должен быть производным от application Exception
  2. В этом классе должен быть конструктор определяемый по умолчанию
  3. Определить конструктор устанавливающий наследуемые свойства message.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

namespace ConsoleApplication1

{

class Myexeption : ApplicationException

{

public Myexeption(int a,int b):

base(“/0!?”)

{

Data.Add(“a”,a);

Data.Add(“b”,b);

}

public Myexeption(string m):

base(m)

{}

}

class Program

{

public static double div(int a, int b)

{

if(b!=0)return a/b;

throw  new Myexeption(a,b);

}

static void Main(string[] args)

{

try

{

int x = 10;

int y = 0;

double z;

z = div(x, y);

}

catch( Myexeption e)

{

foreach(DictionaryEntry i in e.Data)

Console.WriteLine(i.Key.ToString()+ i.Value.ToString());

}

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace my

{

class goodtime

{

private DateTime DT;

private void Setgoodtime()

{

DT = DateTime.Now;

}

public goodtime()

{

Setgoodtime();

}

public override string ToString()

{

Setgoodtime();

string s;

//  s = “Date:”+DT.Day.ToString()+”/”+DT.Month.ToString()+”/”+DT.Year.ToString();

if (DT.Hour >= 6 && DT.Hour<=9) s = “Good morning! “+”Date:” + DT.Day.ToString() + “/” + DT.Month.ToString() + “/” + DT.Year.ToString();

if (DT.Hour >= 9 && DT.Hour <= 12) s = “Good day! ” + “Date:” + DT.Day.ToString() + “/” + DT.Month.ToString() + “/” + DT.Year.ToString();

if (DT.Hour >= 12 && DT.Hour <= 18) s = “Good afternoon! ” + “Date:” + DT.Day.ToString() + “/” + DT.Month.ToString() + “/” + DT.Year.ToString();

if (DT.Hour >= 18 && DT.Hour <= 23) s =  ” Good night! “+”Date:” + DT.Day.ToString() + “/” + DT.Month.ToString() + “/” + DT.Year.ToString() ;

return s;

}

}

class Program

{

static void Main(string[] args)

{

goodtime g=new goodtime();

Console.WriteLine(g.ToString());

}

}

}

- это конструкция которая определяет механизм доступа к закрытым полям класса.

Спецификатор доступа, тип_д, имя свойства

{

Get{//получения свойства;}

Set{//устанавливаем свойства;}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace oop

{

class Employ

{

private string name;

private int age;

private static string organization;

private int[] salaries = new int[] { 1, 2, 3, 4 };

public int this[int i]

{

get { return salaries[i]; }

set { salaries[i] = value; }

}

public string MyField  //ананимное поле, открыт доступ

{

get;

set;

}

static Employ()

{

organization = “HOME”;

}

public Employ(string n, int a)

{

this.name = n;

this.age = a;

}

public Employ(string n) : this(n, 0) { }

public static string Organization

{

get { return organization; }

}

public string Name

{

get { return this.name; }

set { this.name = value; }

}

public int Age

{

get { return this.age; }

set

{

if (value > 0)

this.age = value;

else throw new Exception();

}

}

}

class Program

{

static void Main(string[] args)

{

Employ e = new Employ(“Sveta”, 26);

e.Name = “Oleg”;

e.Age = 3;

Console.WriteLine(e.Name);

Console.WriteLine(e.Age);

Console.WriteLine(Employ.Organization);

Console.WriteLine(e[2]);

}

}

}

1.У каждого свойства есть имя и тип который не может быть void

2.Свойство не классифицируется как переменная, по этому свойства нельзя передавать в качестве параметра ref и out

3. В свойствах можно определять один аксессор

4.Свойства транслируется в специальные методы с именами set_имя_свойства

И get_имя_свойства.

5. Доступ к спецификаторам определяется доступом свойства.

Идексатор или свойство с параметрами – это конструкция которая позволяет пользоваться синтаксисом массива, для доступа элементов классов, коллекциям и массивов.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections; //содержит DictionaryEntry

namespace Employee

{

class MyException : ApplicationException

{

public MyException(double s)

: base(“Попытка присвоить отрицательного значения ЗП!”)

{

Data.Add(“_salary”, s);

} //base – вызывает конструктор базового классса

public MyException(string M) : base(M) { }

}

class Employee

{

private static string ne;

static Employee()

{

ne = “Step”;

}

private int[] S = new int[3]{1,2,3};

private string _name;

private double _salary;

public Employee(string n, double s)

{

_name = n;

_salary = s;

}

public string Name

{

get { return _name; }

set { _name = value; }

}

public double Salary

{

get { return _salary; }

set

{

if (value >= 0) _salary = value;

throw new MyException(value);

}

}

public static string NE

{

get { return ne; }

}

public string snn

{

get;

set;

}

public int this[int i]

{

get {return S[i] ;}

set {S[i]=value ;}

}

}

class Program

{

static void Main(string[] args)

{

Employee E = new Employee(“Bob”, 10000);

Console.WriteLine(“Name: ” + E.Name);

try

{

E.Salary = -1.3;

}

catch (MyException e)

{

foreach (DictionaryEntry i in e.Data)

Console.WriteLine(i.Key.ToString() + ” = ” + i.Value.ToString());

Console.WriteLine(e.Message);

Console.WriteLine(Employee.NE);

Console.WriteLine(E[2]);

}

}

}

}

Это технология определения стандартных операций, для пользовательских типов. В языке С# операторы перегрузки, являются статическими методами, которые возвращают результат операции, а в качестве аргумента используют ее операнды.

С++  : a+b ;   a.operator(b);

C#    : type.operator(a+b);

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class point

{

private int x;

private int y;

public  point(int x,int y)

{

this.x = x;

this.y = y;

}

public override string ToString()

{

return “x=” + x.ToString() + “ny=” + y.ToString();

}

public int X

{

get { return x; }

set { x = value; }

}

public int Y

{

get{return y;}

set { y = value; }

}

public static point operator + (point t, int i)

{

point T = new point(t.x + i,t.y + i);

return T;

}

}

class Program

{

static void Main(string[] args)

{

point p = new point(1,1);

point p2=p+4;

Console.WriteLine(p2.ToString());

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class point

{

private int x;

private int y;

public point(int x, int y)

{

this.x = x;

this.y = y;

}

public override string ToString()

{

return “x=” + x.ToString() + “ny=” + y.ToString();

}

public int X

{

get { return x; }

set { x = value; }

}

public int Y

{

get { return y; }

set { y = value; }

}

public static point operator +(point t, int i)

{

point T = new point(t.x + i, t.y + i);

return T;

}

public static point operator ++(point t)

{

point T = new point(t.x + 1, t.y + 1);

return T;

}

public static bool operator ==(point t,point d)

{

if (t.x == d.x && t.y == d.y)

return  true;

else return false;

}

public static bool operator !=(point t, point d)

{

if (t.x != d.x && t.y != d.y)

return false;

else return true;

}

public static bool operator true(point t)

{

return t.x == 0 && t.y == 0;

}

public static bool operator false(point t)

{

return t.x != 0 && t.y != 0;

}

public static implicit  operator int(point p)

{

return p.x+p.y;

}

public static explicit operator point(int i)

{

point p = new point(i,i);

return  p ;

}

}

class Program

{

static void Main(string[] args)

{

point p = new point(1,1);

point p2 = new point(1,1);

//point p = new point(1, 1);

//point p2 = p + 4;

//point p3 = p++;

//Console.WriteLine(p.ToString());

//p2 += 4;

//Console.WriteLine(p.ToString());

//Console.WriteLine(p3.ToString());

if(p==p2)

Console.WriteLine(“WELL DONE!”);

else Console.WriteLine(“It’s breaked”);

if (p)

{

Console.WriteLine(“Exist!”);

}

else Console.WriteLine(“Is not exist”);

int n = (int)p;

Console.WriteLine(“N={0}”,n);

p = (point)4;

}

}

}

Наследование реализации- первый класс происходит от базового получая от него все функции и члены и данные.

Наследование интерфейса- тип наследует только сигнатуру функций, описывающих поведение класса, но не наследует никакой реализации.

Class<имя класса>:<имя базового класса>

{

//…

}

Class <name_class>:

<name_base_class>,

<name_interface>,

<name_interface>

{

//..

}

C# не поддерживает наследование структурных типов.

Запрет наследования – c с помощью sealed:

class BaseClass

{

public virtual void f() { }

}

class DerivedClass1 : BaseClass

{

public sealed override void f(){}

}

class DerivedClass2 : DerivedClass1

{

//’DerivedClass2.f()’: cannot override inherited member ‘DerivedClass1.f()’ because

// it is sealed

public override void f(){ }

}

using System;

using System.Windows.Forms;

using System.Collections;

namespace NS

{

// запрет наследования

public sealed class A

{

}

public class B : A // Error

{

}

public class Tester

{

public static void Main()

{

// можно создать объект изолированного класса

A obj = new A();

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class seller : Employee

{

private int countSell;

public seller(int countSell,string FullName, int empAge, int empID,

float currPay, string ssn):base( FullName,  empAge,  empID,

currPay,  ssn)

{

this.countSell = countSell;

}

public int Sell

{

get { return countSell; }

set { countSell = value; }

}

public new void DisplayStats()

{

base.DisplayStats();

Console.WriteLine(“countSell:{0}”, countSell.ToString());

}

}

class manager: Employee

{

private int CountClient;

public manager(int CountClient,string FullName, int empAge, int empID,

float currPay, string ssn):base( FullName,  empAge,  empID,

currPay,  ssn)

{

this.CountClient=CountClient;

}

public int Count

{

get { return CountClient; }

set { CountClient = value; }

}

public new void DisplayStats()

{

base.DisplayStats();

Console.WriteLine(“Client:{0}”, CountClient.ToString());

}

}

public class Employee

{

#region Field data

// protected data for kids.

protected string fullName;

protected int empID;

protected float currPay;

protected string empSSN;

protected int empAge;

// private static data.

private static string companyName;

#endregion

#region Constructors

// Default ctor.

//public Employee() { }

// Custom ctor

public Employee(string FullName, int empAge, int empID,

float currPay, string ssn)

{

// Assign internal state data.

// Note use of ‘this’ keyword

// to avoid name clashes.

this.fullName = FullName;

this.empID = empID;

this.currPay = currPay;

this.empSSN = ssn;

this.empAge = empAge;

}

// A static ctor (to assign static field)

static Employee()

{ companyName = “Intertech Training”; }

// If the user calls this ctor, forward to the 4-arg version

// using arbitrary values…

public Employee(string fullName)

: this(fullName, 30, 3333, 0.0F, “”) { }

#endregion

#region Methods

// Bump the pay for this emp.

public void GiveBonus(float amount)

{ currPay += amount; }

// Show state (could use ToString() as well)

public void DisplayStats()

{

Console.WriteLine(“Name: {0}”, fullName);

Console.WriteLine(“Pay: {0}”, currPay);

Console.WriteLine(“ID: {0}”, empID);

Console.WriteLine(“SSN: {0}”, empSSN);

}

#endregion

#region properties

// A static property.

public static string Company

{

get { return companyName; }

set { companyName = value; }

}

// Property for the empID.

public int ID

{

get { return empID; }

set

{

#if DEBUG

Console.WriteLine(“value is an instance of: {0} “, value.GetType());

Console.WriteLine(“value’s value: {0} “, value);

#endif

empID = value;

}

}

// Property for the currPay.

public float Pay

{

get { return currPay; }

set { currPay = value; }

}

// Property for fullName.

public string Name

{

get { return fullName; }

set { fullName = value; }

}

// Another property for ssn.

public string SocialSecurityNumber

{

protected set { empSSN = value; }

get { return empSSN; }

}

public int Age

{

get { return empAge; }

set { empAge = value; }

}

#endregion

}

class Program

{

static void Main(string[] args)

{

manager m=new manager(0,”Bizid”,12,1,12,”ssn”);

m.DisplayStats();

seller s = new seller(12, “Sveta”, 15, 5, 123, “ssn”);

s.DisplayStats();

}

}

//менеджер – ифно о кол.клиентов

//Продваец – сколкьо продаж

}

  1. Создать структуру данных базового типа, присвоить в эту структуру ссылки объектов производных классов.
  2. Функция базового класса которая используется для реализации полиморфизма, должны быть отмечены ключевым словом virtual.
  3. Функции члены производных классов которые участвуют в полиморфизме, должны быть отмечены ключевым словом override.

ОПЕРАТОРЫ РАСПОЗНАНИЯ ТИПА:

Is

As

class A { }

class B: A { }

static void Main()

{

object i = new int();

Console.WriteLine(“i is objetc: {0}”, i is object); //true a является object

Console.WriteLine(“i is int: {0}”, i is int); //true a является int

Console.WriteLine(“i is string: {0}”, i is string); //false a не является string

A a = new A();

Console.WriteLine(“a is B: {0}”, a is B);

//false в a содержится объект базового класса

a = new B();

Console.WriteLine(“a is B: {0}”, a is B);

//true в a содержится объект производного класса

}

class A { }

class B: A { }

static void Main()

{

A a = new A();

B b = a as B;

//будет null,

//т.к. объект базового класса (A)не является объектом производного класса (B)

if (b == null) Console.WriteLine(“b is null”);

else Console.WriteLine(b);

object o = a as object;

//будет преобразоание а к типу object,

//т.к. объект производного класса (A) является объектом базового класса (object)

if (o == null) Console.WriteLine(“o is null”);

else Console.WriteLine(o);

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class seller : Employee

{

private int countSell;

public seller(int countSell,string FullName, int empAge, int empID,

float currPay, string ssn):base( FullName,  empAge,  empID,

currPay,  ssn)

{

this.countSell = countSell;

}

public int Sell

{

get { return countSell; }

set { countSell = value; }

}

public override  void DisplayStats()

{

base.DisplayStats();

Console.WriteLine(“countSell:{0}”, countSell.ToString());

}

public override void GiveBonus(float amount)

{ if(countSell>10 )

{

base.GiveBonus(amount/=10);

}

}

}

class manager: Employee

{

private int CountClient;

public manager(int CountClient,string FullName, int empAge, int empID,

float currPay, string ssn):base( FullName,  empAge,  empID,

currPay,  ssn)

{

this.CountClient=CountClient;

}

public int Count

{

get { return CountClient; }

set { CountClient = value; }

}

public override  void DisplayStats()

{

base.DisplayStats();

Console.WriteLine(“Client:{0}”, CountClient.ToString());

}

public override void GiveBonus(float amount)

{ base.GiveBonus (amount*= CountClient); }

}

public class Employee

{

#region Field data

// protected data for kids.

protected string fullName;

protected int empID;

protected float currPay;

protected string empSSN;

protected int empAge;

// private static data.

private static string companyName;

#endregion

#region Constructors

// Default ctor.

//public Employee() { }

// Custom ctor

public Employee(string FullName, int empAge, int empID,

float currPay, string ssn)

{

// Assign internal state data.

// Note use of ‘this’ keyword

// to avoid name clashes.

this.fullName = FullName;

this.empID = empID;

this.currPay = currPay;

this.empSSN = ssn;

this.empAge = empAge;

}

// A static ctor (to assign static field)

static Employee()

{ companyName = “Intertech Training”; }

// If the user calls this ctor, forward to the 4-arg version

// using arbitrary values…

public Employee(string fullName)

: this(fullName, 30, 3333, 0.0F, “”) { }

#endregion

#region Methods

// Bump the pay for this emp.

public virtual void GiveBonus(float amount)

{ currPay += amount; }

// Show state (could use ToString() as well)

public virtual void DisplayStats()

{

Console.WriteLine(“Name: {0}”, fullName);

Console.WriteLine(“Pay: {0}”, currPay);

Console.WriteLine(“ID: {0}”, empID);

Console.WriteLine(“SSN: {0}”, empSSN);

}

#endregion

#region properties

// A static property.

public static string Company

{

get { return companyName; }

set { companyName = value; }

}

// Property for the empID.

public int ID

{

get { return empID; }

set

{

#if DEBUG

Console.WriteLine(“value is an instance of: {0} “, value.GetType());

Console.WriteLine(“value’s value: {0} “, value);

#endif

empID = value;

}

}

// Property for the currPay.

public float Pay

{

get { return currPay; }

set { currPay = value; }

}

// Property for fullName.

public string Name

{

get { return fullName; }

set { fullName = value; }

}

// Another property for ssn.

public string SocialSecurityNumber

{

protected set { empSSN = value; }

get { return empSSN; }

}

public int Age

{

get { return empAge; }

set { empAge = value; }

}

#endregion

}

class Program

{

static void Main(string[] args)

{

//manager m=new manager(0,”Bizid”,12,1,12,”ssn”);

//m.DisplayStats();

//seller s = new seller(12, “Sveta”, 15, 5, 123, “ssn”);

//s.DisplayStats();

Employee[] E=new Employee[2]{new manager (0,”Bizid”,12,1,12,”ssn”),new seller(12, “Sveta”, 15, 5, 123, “ssn”)};

E[0].DisplayStats();

E[1].DisplayStats();

E[0].GiveBonus(100);

E[1].GiveBonus(100);

}

}

//менеджер – ифно о кол.клиентов

//Продваец – сколкьо продаж

}

Интерфейсы – именованный набор сигнатур методов,

Именованные конструкции : класс, структура, свойства и тд.

Сигнатура – описание, правила строения, или прототип.

Интерфейс – это контракт обеспечивающий определенное поведение класса или структуры.

Правила объявления:

[атрибуты][модификаторы доступа]interface name_interface [список базовых интерфейсов]

{

//Тело интерфейса

}

Правила:

1.В интерфейсе нельзя определять конструкторы и экземплярные поля.

2.В интерфейсе нельзя определять статические члены.

3.Интерфейсы никогда не указывают базовый класс.

Для всех членов интерфейса не указываются модификаторы доступа.(Не явно открытые)

interface IA

{

void f();//неявно открытый и абстрактный

}

interface IB

{

void g();//неявно открытый и абстрактный

}

class Base

{

}

class C : Base, IA, IB

{

// обязательная реализация функций f и g

public void f()

{

}

public void g()

{

}

}

Цели интерфейса:

  1. Определить функциональные возможности, которыми должен обладать класс.
  2. реализация множественного наследования

3. Интерфейсы могут использоваться для реализации полиморфного поведения класса.

Особенности работы с интерфейсов:

1.C# требует чтобы методы интерфейса были виртуальными, если метод явно не виртуален компилятор сделает его изолированным(не позволяет производному классу переопределять методы интерфейса) Примечание: производный класс не может переопределить изолированные методы интерфейса, но может повторно унаследовать тот же интерфейс

class Base : IDisposable

{

public void Dispose()

{

Console.WriteLine(“Base dispose”);

}

}

class Derived : Base, IDisposable

{

public new void Dispose()

//этот метод не может переопределить Dispose в Base

//вместо этого он повторно реализуется метод Dispose IDisposable

{

Console.WriteLine(“Derived dispose”);

}

}

class Test

{

static void Main()

{

Base b = new Base();

b.Dispose();                //Base Dispose

((IDisposable)b).Dispose(); //Base Dispose

Derived d = new Derived();

d.Dispose();                 //Derived Dispose

((IDisposable)d).Dispose();  //Derived Dispose

Base d1 = new Derived();

d1.Dispose();                //Base Dispose

((IDisposable)d1).Dispose(); //Derived Dispose

}

}

Интерфейсы языка могут использоваться

В качестве типов переменных типов возврата и параметров функции.

Чем отличается интерфейс от абстрактных классов:

Общее черты абстрактных классов и интерфейсов:

  1. И у интерфейса и у абстрактного класса есть абстрактные методы
  2. Те и те Используются для полиморфизма.

Отличия:

  1. Абстрактные классы описывают целиком или частично , интерфейсы представляют собой поведение класса (без реализации).
  2. С помощью интерфейсов реализовывается множественное наследование.

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

#endregion

namespace Shapes

{

#region Shape class

public abstract class Shape

{

// Shapes can be assigned a friendly pet name.

protected string petName;

// Constructors.

public Shape() { petName = “NoName”; }

public Shape(string s) { petName = s; }

// Draw() is now completely abstract (note semicolon).

public abstract void Draw();

public string PetName

{

get { return petName; }

set { petName = value; }

}

}

#endregion

#region Circle class

public class Circle : Shape

{

public Circle() { }

public Circle(string name) : base(name) { }

// Now Circle must decide how to render itself.

public override void Draw()

{

Console.WriteLine(“Drawing {0} the Circle”, PetName);

}

}

#endregion

#region Hexagon class

public class Hexagon : Shape

{

public Hexagon() { }

public Hexagon(string name) : base(name) { }

public override void Draw()

{

Console.WriteLine(“Drawing {0} the Hexagon”, petName);

}

}

#endregion

public class ThreeDCircle : Circle

{

new protected string petName;

new public void Draw()

{

Console.WriteLine(“Drawing a 3D Circle”);

}

}

}

//////////////////////////////////////////////////////////////////////

namespace Shapes

{

class Program

{

// Create an array of various Shapes.

static void Main(string[] args)

{

Console.WriteLine(“***** Fun with Polymorphism *****n”);

Shape[] myShapes = {new Hexagon(), new Circle(), new Hexagon(“Mick”),

new Circle(“Beth”), new Hexagon(“Linda”)};

// Loop over the array and ask each object to draw itself.

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

myShapes[i].Draw();

ThreeDCircle o = new ThreeDCircle();

o.Draw();            // Calls ThreeDCircle.Draw()

((Circle)o).Draw();  // Calls Circle.Draw()

Console.ReadLine();

}

}

}

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

#endregion

namespace Shapes

{

interface Imy

{

void Draw();

}

#region Shape class

public  class Shape

{

// Shapes can be assigned a friendly pet name.

protected string petName;

// Constructors.

public Shape() { petName = “NoName”; }

public Shape(string s) { petName = s; }

public string PetName

{

get { return petName; }

set { petName = value; }

}

}

#endregion

#region Circle class

public class Circle : Shape, Imy

{

public Circle() { }

public Circle(string name) : base(name) { }

// Now Circle must decide how to render itself.

public  void Draw()

{

Console.WriteLine(“Drawing {0} the Circle”, PetName);

}

}

#endregion

#region Hexagon class

public class Hexagon : Shape, Imy

{

public Hexagon() { }

public Hexagon(string name) : base(name) { }

public  void Draw()

{

Console.WriteLine(“Drawing {0} the Hexagon”, petName);

}

}

#endregion

public class ThreeDCircle : Circle

{

new protected string petName;

new public void Draw()

{

Console.WriteLine(“Drawing a 3D Circle”);

}

}

}

//////////////////////////////////////////////////////////////////////

namespace Shapes

{

class Program

{

// Create an array of various Shapes.

static void Main(string[] args)

{

Console.WriteLine(“***** Fun with Polymorphism *****n”);

Imy[] myShapes = {new Hexagon(), new Circle(), new Hexagon(“Mick”),

new Circle(“Beth”), new Hexagon(“Linda”)};

// Loop over the array and ask each object to draw itself.

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

myShapes[i].Draw();

ThreeDCircle o = new ThreeDCircle();

o.Draw();            // Calls ThreeDCircle.Draw()

((Circle)o).Draw();  // Calls Circle.Draw()

Console.ReadLine();

}

}

}

Явная и неявная реализация интерфейсов

  1. Неявная реализация интерфейса – в классе содержится метод, сигнатура которого, соответствует сигнатуре метода интерфейса.
  2. Явная реализация – создается когда перед именем стоит имя интерфейса которым определен этот метод.

Особенности, нельзя указывать область модификатор доступа, для данного метода(всегда private).

Единственный способ вызвать данный метод интерфейса, обратится через переменную этого интерфейсного типа.

public interface I1

{

void f();

}

public interface I2

{

void f();

}

public class Inherit : I1, I2

{

//явная реализация метода для 2 интерфейсов

void I1.f() { Console.WriteLine(“I1″); }

void I2.f() { Console.WriteLine(“I2″); }

}

class Test

{

static void Main()

{

Inherit i = new Inherit();

((I1)i).f(); //вызывается реализация для I1

((I2)i).f(); //вызывается реализация для I2

i.f(); //ошибка компиляции

}

}

Создание перечисляемых типов (IEnumerable, IEnumerator)

Для того чтобы переменную типа можно было использовать в цикле foreach этот тип должен реализовывать интерфейс IEnumerable.

public interface IEnumerable

{

IEnumerator GetEnumerator();

}

IEnumerator содержит методы, позволяющие перемещаться по массиву, который является  IEnumerable совместимым контейнером.

public interface IEnumerator

{

bool MoveNext();

object Current();

void Reset()

}

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

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

using System.Collections;

#endregion

namespace Shapes

{

//////////////////////////////////////////////////////////////////////

public class Employee : IEnumerable

{

protected string fullName;

protected int empID;

protected float currPay;

protected string empSSN;

protected int empAge;

private int[] Salary = { 1,2,3,4,5,6};

private static string companyName;

public Employee() { }

public Employee(string FullName, int empAge, int empID,

float currPay, string ssn)

{

this.fullName = FullName;

this.empID = empID;

this.currPay = currPay;

this.empSSN = ssn;

this.empAge = empAge;

}

static Employee()

{ companyName = “Intertech Training”; }

public Employee(string fullName)

: this(fullName, 30, 3333, 0.0F, “”) { }

public void GiveBonus(float amount)

{ currPay += amount; }

public void DisplayStats()

{

Console.WriteLine(“Name: {0}”, fullName);

Console.WriteLine(“Pay: {0}”, currPay);

Console.WriteLine(“ID: {0}”, empID);

Console.WriteLine(“SSN: {0}”, empSSN);

}

public static string Company

{

get { return companyName; }

set { companyName = value; }

}

public int ID

{

get { return empID; }

set

{

#if DEBUG

Console.WriteLine(“value is an instance of: {0} “, value.GetType());

Console.WriteLine(“value’s value: {0} “, value);

#endif

empID = value;

}

}

public float Pay

{

get { return currPay; }

set { currPay = value; }

}

public string Name

{

get { return fullName; }

set { fullName = value; }

}

public string SocialSecurityNumber

{

protected set { empSSN = value; }

get { return empSSN; }

}

public int Age

{

get { return empAge; }

set { empAge = value; }

}

#region IEnumerable Members

public IEnumerator  GetEnumerator()

{

return Salary.GetEnumerator();

}

#endregion

}

class Program

{

// Create an array of various Shapes.

static void Main(string[] args)

{

Employee e = new Employee();

foreach (int i in e)

Console.WriteLine(i);

Console.ReadLine();

}

}

}

Genery не подерживает арифматические операторы с параметрами типов.

Genery не подерживает параметры шаблонов, в отличаи от  параметров типов. Genery не подерживает спецелизацию шаблонов. В Genery не могут иметь значение по умолчанию.

Правило наследование обобщёных класов

1. Если обощёного класа наследуется не обобщёный клас, наследник должен кантритезаровать параметров типов.

2.При релизауии обощёных виртуальных метадов не обощёный клас должен катректизировать параметов типов

  1. если от обощёного класа наследуется обощёный класс в нём неоходимо учитовать ограничение типов указаных классов.

System.Collections.Generic

Упаковка -процесс перевода значимого типа в ссылочный

Распаковка- обратный процесс(ссылочный в значимый тип)

Проблема_1.txt

// Неправильная распаковка.

/////////////////// — 1

static void Main(string[] args)

{

short s = 25;

object objShort = s;

try

{

// Тип, хранящийся в упаковке – не int, a short!

int i = (int)objShort;

}

catch (InvalidCastException e)

{

Console.WriteLine(“OOPS!n{0} “, e.ToString());

}

///////////////////// — 2

public class System.Collections.ArrayList : object,

System.Collections.IList,

System.Collections.ICollection,

System.Collections.IEnumerable,

ICloneable

{

public virtual int Add(object value);

public virtual void Insert(int index, object value);

public virtual void Remove(object obj) ;

public virtual object this[int index] {get; set; }

}

/////////////////////// — 3

static void Main(string [ ] args)

{

// Типы значений автоматически упаковываются

// при передаче методу, принимающему объект.

ArrayList mylnts = new ArrayList ();

mylnts.Add(lO);

Console.ReadLine();

}

/////////////////////// — 4

static void Main(string[] args)

{

// Теперь значение распаковано.

int i = (int)mylnts[0];

// Теперь упаковано заново, поскольку WriteLine() требует объектных типов!

Console.WriteLine(“Value of your int: {0}”, i);

Console.ReadLine();

}

Проблема_2.txt

//////////////////////

static void Main(string [] args)

{

// ArrayList может хранить все что угодно.

ArrayList allMyObject = new ArrayList ();

allMyObjects.Add(true);

allMyObjects.Add(new Car());

allMyObjects.AddF6);

allMyObjects.AddC.14);

}

///////////////////////

задача безопасность типов.txt

using System;

using System.Collections.Generic;

using System.Text;

using System.Collections;

namespace CustomNonGenericCollection

{

#region Person type

public class Person

{

// Made public for simplicity.

public int Age;

public string FirstName, LastName;

public Person() { }

public Person(string firstName, string lastName, int age)

{

Age = age;

FirstName = firstName;

LastName = lastName;

}

public override string ToString()

{

return string.Format(“Name: {0} {1}, Age: {2}”,

FirstName, LastName, Age);

}

}

#endregion

#region PersonCollection

#endregion

class Program

{

static void Main(string[] args)

{

}

}

}

пример безопасность типов.txt

using System;

using System.Collections.Generic;

using System.Text;

using System.Collections;

namespace CustomNonGenericCollection

{

#region Person type

public class Person

{

// Made public for simplicity.

public int Age;

public string FirstName, LastName;

public Person() { }

public Person(string firstName, string lastName, int age)

{

Age = age;

FirstName = firstName;

LastName = lastName;

}

public override string ToString()

{

return string.Format(“Name: {0} {1}, Age: {2}”,

FirstName, LastName, Age);

}

}

#endregion

#region PersonCollection

public class PeopleCollection : IEnumerable

{

private ArrayList arPeople = new ArrayList();

public PeopleCollection() { }

// Cast for caller.

public Person GetPerson(int pos)

{ return (Person)arPeople[pos]; }

// Only insert Person types.

public void AddPerson(Person p)

{ arPeople.Add(p); }

public void ClearPeople()

{ arPeople.Clear(); }

public int Count

{ get { return arPeople.Count; } }

// Foreach enumeration support.

IEnumerator IEnumerable.GetEnumerator()

{ return arPeople.GetEnumerator(); }

}

#endregion

#region Car / CarCollection

public class Car{}

public class CarCollection : IEnumerable

{

private ArrayList arCars = new ArrayList();

public CarCollection() { }

// Cast for caller.

public Car GetCar(int pos)

{ return (Car)arCars[pos]; }

// Only insert Car types.

public void AddCar(Car c)

{ arCars.Add(c); }

public void ClearCars()

{ arCars.Clear(); }

public int Count

{ get { return arCars.Count; } }

// Foreach enumeration support.

IEnumerator IEnumerable.GetEnumerator()

{ return arCars.GetEnumerator(); }

}

#endregion

class Program

{

static void Main(string[] args)

{

Console.WriteLine(“***** Custom Person Collection *****n”);

PeopleCollection myPeople = new PeopleCollection();

myPeople.AddPerson(new Person(“Homer”, “Simpson”, 40));

myPeople.AddPerson(new Person(“Marge”, “Simpson”, 38));

myPeople.AddPerson(new Person(“Lisa”, “Simpson”, 9));

myPeople.AddPerson(new Person(“Bart”, “Simpson”, 7));

myPeople.AddPerson(new Person(“Maggie”, “Simpson”, 2));

// This would be a compile-time error!

// myPeople.AddPerson(new Car());

foreach (Person p in myPeople)

Console.WriteLine(p);

Console.ReadLine();

}

}

}

System.Collections.Generic(таблица)

Обобщенные контейнеры Необобщенные контейнеры Описание
Collection<T> CollectionBase Базовый класс для коллекций
List<T> ArrayList Список элементов с динамически изменяемым размером
Dictionary<TKey, TValue> Hashtable Коллекция пар имя – значение
SortedDictionary<TKey, TValue> SortedList Сортированная коллекция пар имя – значение
Stack<T> Stack Реализация списка LIFO
Queue<T> Queue Реализация списка FIFO
LinkedList<T> нет Реализация двухсвязного списка
Обобщенные интерфейсы Необобщенные итерфейсы
ILits<T> ILits
IDictionary<T> IDictionary
ICollection<T> ICollection
IEnumerator<T> IEnumerator
IComparer<T> IComparer
IComparable<T> IComparable

Обобщённые классы

Array AL=new Array();

List<Racer>L=new List<Racer>();

Пример : созд коллекцию, заполнить intами

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace coll_int

{

class Program

{

static void Main(string[] args)

{

Random R = new Random();

List<int> L = new List<int>();

for (int i = 0; i < 10; i++)

L.Add(R.Next(1, 100));

foreach (int i in L)

{

Console.WriteLine(i.ToString());

}

}

}

}

Обобщённые методы

Задача

В классе program написать ф-ю «обмен», к-рая принимает 2 параметра, меняет их местами, принимает любые переменные

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Generic

{

class Program

{

static void f<T>(ref T a, ref T b)

{

T t = a;

a = b;

b = t;

}

static void Main(string[] args)

{

int x = 10;

int y = 20;

f<int>(ref x, ref y);

Console.WriteLine(x + “  ” + y);

}

}

}

Пример обобщенный класс точки.txt

using System.Collections.Generic;

using System.Text;

namespace GenericInterface

{

public class Point2D<T> where T: struct

{

T x;

T y;

public T X

{

get { return x; } set { x = value; }

}

public T Y

{

get { return y; } set { y = value; }

}

public Point2D(T x, T y)

{

this.x = x; this.y = y;

}

public Point2D()

{

this.x = default(T); this.y = default(T);

}

}

class Program

{

static void Main(string[] args)

{

//тестирование обобщенного базового класса – точки в 2D

Point2D<int> p1 = new Point2D<int>(10, 20);

Console.WriteLine(“x = {0} y = {1}”, p1.X, p1.Y);

Point2D<double> p1 = new Point2D<int>(10.0, 20.0);

Console.WriteLine(“x = {0} y = {1}”, p1.X, p1.Y);

Console.WriteLine(typeof(Point2D<int>).ToString());

Console.WriteLine(typeof(Point2D<double>).ToString());

}

}

}

ограничения параметров-типов обобщений.txt

Ограничение обобщения           Описание

where T: struct         Параметр типа должен наследоваться от system.ValueType, т.е. быть структурным типом

where T: class          Параметр типа не должен наследоваться от system.ValueType, т.е. быть ссылочным типом

where T: new()         Класс должен иметь конструктор по умолчанию (указывается последним)

where T: BaseClass Параметр типа должен быть производным классом от указанного базового класса

where T: Interface    Параметр типа должен реализовать указанный интерфейс

////////////////

// Класс MyGenericClass унаследован от Object, причем содержащиеся

//в нем элементы должны иметь конструктор по умолчанию.

class MyGenericClass<T> where T: class, IComparable, new()

{… }

// MyGenericClass унаследован от Object, причем содержащиеся

//в нем элементы должны относиться к классу, реализующему IDrawable.

//и поддерживать конструктор по умолчанию.

public class MyGenericClass<T> where T : class, IDrawable, new()

{…}

// MyGenericClass унаследован от MyBase и реализует ISomelnterfасе,

// причем содержащиеся элементы должны быть структурами.

public class MyGenericClass<T> : MyBase, ISomelnterface where T : struct

{…}

Кстати, при построении обобщенного типа, специфицирующего несколько  параметров-типов, можно указать уникальный набор ограничений для каждого:

// <К> должен иметь конструктор по умолчанию, в то время как <Т>

// должен реализовывать обобщенный интерфейс IComparable.

public class MyGenericClass<K, T> where К : new()

where T : IComparable<T>

{…}

Имейте в виду, что обобщенные методы также могут использовать ключевое слово where. Например, если необходимо гарантировать, что методу Swap() будут  передаваться только типы, унаследованные от System.ValueType, созданному ранее в этой главе, обновите код соответствующим образом:

// Этот метод обменяет местами два типа значения, но не классы.

static void Swap<T>(ref T a, ref T b) where T : struct

{

}

ОГРАНИЧЕНИЯ:

  1. Generic collections не поддерживают арифметические операторы с параметрами типов.
  2. Generic collections не поддерживают параметры шаблонов, отличающиеся от параметров типа.
  3. Generic collections не поддерживают специализацию шаблона.
  4. Generic collections в параметре типа не могут иметь значение по умолчанию.

ПРАВИЛО НАСЛЕДОВАНИЯ ОБОБЩЁННЫХ КЛАССОВ:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace GenericInterface

{

public class Point2D<T> where T : struct

{

T x;

T y;

public T X

{

get { return x; }

set { x = value; }

}

public T Y

{

get { return y; }

set { y = value; }

}

public Point2D(T x, T y)

{

this.x = x; this.y = y;

}

public Point2D()

{

this.x = default(T); this.y = default(T);

}

}

public class Point3D<T> : Point2D<T> where T : struct

{

T z;

public T Z

{

get { return z; }

set { z = value; }

}

public Point3D(T x, T y, T z):base(x,y)

{

this.z = z;

}

public Point3D()

{

this.z = default(T);

}

public override string ToString()

{

return “Координаты: х=” + this.X + ” y=” + this.Y + ” z=” + z + “n”;

}

}

public class Circle : Point2D<int>

{

private int _Radius;

public Circle (int x,int y,int R):base(x,y)

{

_Radius=R;

}

public Circle()

{

_Radius = 2;

}

public int Radius

{

get { return _Radius; }

set { _Radius = value; }

}

public double Lenth()

{

double rez=0;

rez = (_Radius * 2) * 3.14;

return rez;

}

public override string ToString()

{

return “Координаты центра: х=” + this.X + ” y=” + this.Y + “tДлинна радиуса: ” + _Radius+”n”;

}

}

class Program

{

static void Main(string[] args)

{

Point3D<int> P = new Point3D<int>(3, 2, 7);

Console.WriteLine(P.ToString());

Circle C = new Circle(0, 0, 8);

Console.WriteLine(C.ToString());

Console.WriteLine(“Длинна окружности : “+C.Lenth().ToString());

}

}

}

Сделать практику про компьютер используя generic class

System.Collections

Работа с файлами

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace file

{

class Program

{

static void Main(string[] args)

{

FileInfo f =new FileInfo(@”D:LOGANN.txt”);

if (f.Exists)

{

/* DateTime d = DateTime.Now;

Console.WriteLine(f.CreationTime);

Console.WriteLine(f.LastAccessTime);

f.CreationTime = DateTime.Now;

Console.WriteLine(f.CreationTime);*/

//  f.CopyTo(@”D:sitesLOGANNN.txt”);

//File.Delete(@”C:WINDOWSsystem32driversetcservices”);

}

else Console.WriteLine(“DENIED!”);

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace file

{

class Program

{

static void Main(string[] args)

{

FileInfo f =new FileInfo(@”D:LOGAN.txt”);

DisplayFileSystemInfoAttributes(f);

}

static void DisplayFileSystemInfoAttributes(FileSystemInfo fsi)

{

//  Assume that this entry is a file.

string entryType = “File”;

// Determine if entry is really a directory

if ((fsi.Attributes & FileAttributes.Directory) == FileAttributes.Directory)

{

entryType = “Directory”;

}

//  Show this entry’s type, name, and creation date.

Console.WriteLine(“{0} entry {1} was created on {2:D}”, entryType, fsi.FullName, fsi.CreationTime);

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace file

{

class Program

{

static void Main(string[] args)

{

DirectoryInfo df = new DirectoryInfo(@”C:”);

if (df.Exists)

{

DirectoryInfo[] name = df.GetDirectories();

foreach (DirectoryInfo i in name)

Console.WriteLine(i.Name);

Console.WriteLine(“————————————-”);

FileInfo[] fname = df.GetFiles();

foreach (FileInfo s in fname)

Console.WriteLine(s.Name);

Console.WriteLine(“————————————-”);

}

else Console.WriteLine(“NOT FOUND”);

DriveInfo D = new DriveInfo(@”C:”);

DriveInfo[] inf = DriveInfo.GetDrives();

foreach (DriveInfo a in inf)

{

if (a.IsReady)

{

Console.WriteLine(a.Name + ” – ” + ((a.TotalSize) / 1e9));

}

}

Console.WriteLine(“————————————-”);

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace file

{

class Program

{

static void Main(string[] args)

{

string s=Path.GetTempFileName();

Console.WriteLine(Path.GetDirectoryName(s) + Path.GetFileName(s)+” nРасширение файла: “+Path.GetExtension(s));

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace file

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine(File.ReadAllText(@”D:LOGAN.txt”));

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace file

{

class Program

{

static void Main(string[] args)

{

//File.CreateText

StreamWriter s;

s = new StreamWriter(@”D:LOGANN.txt”);

if (s!=null)

{

s.Write(“Hello!”);

s.Close();

}

else Console.WriteLine(“File is fail!”);

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace file

{

class Program

{

static void Main(string[] args)

{

//StreamWriter s;

//s = new StreamWriter(@”D:LOGANN.txt”);

//if (s!=null)

//{

//    s.Write(“Hello!”);

//    s.Close();

//}

//else Console.WriteLine(“File is fail!”);

StreamWriter sw = File.AppendText(@”D:LOGANN.txt”);

sw.Write(“LOGAN”);

sw.Close();

}

}

}

Атрибут- объект содержащий информацию описательного характера об элементах

using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection;

namespace CustomAttribute

{

class Program

{

//AttributeUsage:

//   AttributeTargets задает, к каким элементам может быть применен атрибут

//   AllowMultiple может ли атрибут применяться несколько раз к одному и тому же элементу

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]

class BugFixAttribute : Attribute

{

private string name;

private string date;

public BugFixAttribute(string name, string date)

{

this.name = name;

this.date = date;

}

override public string ToString()

{

return name + ” ” + date;

}

}

[BugFix("Ivan", "01.01.2007")]

[BugFix("Jhon", "02.01.2007")]

public void f() { }

//ошибка! Атрибут BugFix Атрибут не может применяться к классу

//[BugFix("Mary", "01.01.2007")]

//class Student{}

static void Main(string[] args)

{

Type t = typeof(Program);

//получаем информацию о методе по его имени

MethodInfo mi = t.GetMethod(“f”);

//получаем пользовательские атрибуты метода, false – не включать унаследованные атрибуты

//получаем только атрибуты типа BugFixAttribute

object[] attr = mi.GetCustomAttributes(typeof(BugFixAttribute), false);

//получаем все атрибуты

//object[] attr = mi.GetCustomAttributes(typeof(BugFixAttribute), false);

foreach (BugFixAttribute a in attr)

{

Console.WriteLine(a.ToString());

}

}

}

}

using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection;

namespace Employees

{

class sad : Attribute

{

private string name;

private string date;

public sad(string name, string date)

{

this.name = name;

this.date = date;

}

override public string ToString()

{

return name + ” ” + date;

}

}

[sad("asdsa", "31231231")]

class Employee

{

protected string fullName;

protected int empID;

protected float currPay;

// Default ctor.

public Employee() { }

// Custom ctor

public Employee(string FullName, int empID,

float currPay)

{

// Assign internal state data.

// Note use of ‘this’ keyword

// to avoid name clashes.

this.fullName = FullName;

this.empID = empID;

this.currPay = currPay;

}

// Bump the pay for this emp.

public virtual void GiveBonus(float amount)

{ currPay += amount; }

// Show state (could use ToString() as well)

public virtual void DisplayStats()

{

Console.WriteLine(“Name: {0}”, fullName);

Console.WriteLine(“Pay: {0}”, currPay);

Console.WriteLine(“ID: {0}”, empID);

}

}

class Program

{

static void Main(string[] args)

{

Type t = typeof(Employee);

object[] attr = t.GetCustomAttributes(typeof(sad), false);

foreach (sad a in attr)

{

Console.WriteLine(a.ToString());

}

}

}

}

Сериализация это возможность сохранения объекта и воссоздания его при необходимости для хранения объектов и обмена данными.

  1. Конфигурирование объектов для сериализации – здесь вы должны проанализировать наперед какую сериализацию мы будем использовать.
  2. Выбор форматтера:

Binary formatter, Soap Formatter , Xml formatter

3.Выполнение сериализации:

1.Создать потоковый объект который будет хранить выходные данные сериализации.

2.создать объект форматера для первого или для второго

3.Выполнить метод Serialize.

4.Выполнение десириализации:

1.Создать потоковый объект для считывания результата

2.Создать объект форматера  для первого или для второго.

3.создать объект для хранения данных после сериализации.

4.Выполнить метод deserialize и привести полученный объект у нужному типу.

using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection;

using System.Runtime.Serialization.Formatters.Binary;

using System.IO;

namespace Employees

{

class program

{

static void Main(string[] args)

{

FileStream f = new FileStream(@”D:mine”, FileMode.OpenOrCreate);

BinaryFormatter bf = new BinaryFormatter();

DateTime d = new DateTime();

bf.Serialize(f, d);

f.Close();

FileStream fs = new FileStream(@”D:mine”, FileMode.Open, FileAccess.Read);

byte[] b = new byte[16];

while (fs.Position < fs.Length)

{

fs.Read(b, 0, 16);

for (int i = 0; i < 16; i++) Console.Write(“{0,3:x2}”, b[i]);

Console.WriteLine();

}

fs.Close();

//FileStream f = new FileStream(@”D:mine”, FileMode.Open);

//BinaryFormatter bf = new BinaryFormatter();

//DateTime d = new DateTime();

//d = (DateTime)bf.Deserialize(f);

//Console.Write(d.ToString());

//f.Close();

}

}

}

using System;

using System.IO;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Soap;

namespace SoapFormatterSerialization

{

[Serializable]

class Shopping : IDeserializationCallback

{

private double _price;

private int _number;

[NonSerialized]

private double _sum; //несериализировать

public Shopping()

{

_price = _sum = 0;

_number = 0;

}

public Shopping(double pr, int num)

{

_price = pr;

_number = num;

_sum = pr * num;

}

public double Price

{

get { return _price; }

set { _price = value; }

}

public double Sum

{

get { return _sum; }

set { _sum = value; }

}

public int Number

{

get { return _number; }

set { _number = value; }

}

public override string ToString()

{

return “Price: ” + _price.ToString() + “nNumber: ” + _number.ToString() + “nSum: ” + _sum.ToString();

}

#region IDeserializationCallback Members

public void OnDeserialization(object sender)

{

_sum = _price * _number;

}

#endregion

}

class Program

{

static void Main(string[] args)

{

Shopping shop = new Shopping(15.98, 2);

Console.WriteLine(“Initial object:n—————n” + shop.ToString());

FileStream fs = new FileStream(“DataFile.soap”, FileMode.Create);

SoapFormatter formatter = new SoapFormatter();

try

{

formatter.Serialize(fs, shop);

}

catch (SerializationException e)

{

Console.WriteLine(“Failed to serialize. Reason: ” + e.Message);

throw;

}

finally

{

fs.Close();

}

}

}

}

Алгоритм сборки мусора:

1.Сборщик мусора предполагает что все объекты в куче – мусор.

2.Маркировка – отмечаются объекты для которых имеются корни.Корни- это существующие ссылки в программе на данный объект.

3.Сжатие удаляются немаркированные объекты и сдвигаются расположенные далее блоки.

4.Обновление значений корней чтобы они содержали новые адреса объекта.

5.объекты оставшиеся в куче после сборки переводятся в следующее поколение.

Поколения: 0,1,2.

При инициализации в CLR устанавливается пороговые значения для всех трех поколений

0: 256kb, 1:2mb, 2:10mb.

using System;

using System.IO;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml.Serialization;

namespace XmlSerialization

{

class test

{

~test()

{

Console.WriteLine(“I’m a destructor!”);

}

}

class Program

{

static void Main(string[] args)

{

test t = new test();

Console.WriteLine(“Поколение:” + GC.GetGeneration(t));

GC.Collect();

Console.WriteLine(“Поколение:” + GC.GetGeneration(t));

GC.Collect();

Console.WriteLine(“Поколение:” + GC.GetGeneration(t));

GC.Collect();

Console.WriteLine(“Поколение:” + GC.GetGeneration(t));

GC.Collect();

Console.WriteLine(“Поколение:” + GC.GetGeneration(t));

}

}

}

Завершение или Finalization это механизм поддерживаемый CLR, позволяющий объекту выполнить корректную очистку прежде чем сборщик мусора освободит занятую им память.

Делегаты.События.

typedef  void (*func)(int);

//определяем тип указателя еа функцию, которая принимает один параметр типа int

//и ничего не возвращает

void f1(int a)

{

cout << a << endl;

}

void f2(double a, int b, int c)

{

cout << a << endl;

}

int main()

{

func pf  = f1;

int a = 10;

pf(a); //10 – Ok

//Применры ошибок, которые можно допустить при использовании указателей на функцию

pf = (func)((char*)f2); //явное приведение адреса функуции f2 к типу указателя pf

pf(a); //странное число, т.к. при вызове в стек поместилось 4 байта – значение a,

//а прочиталось 8, в предположении, что передано double

pf = (func)((char*)f1 + 2);

pf(a); //ошибка выполнения, т.к. управление передается не на начало функции

pf = (func)1;

pf(a); //ошибка выполнения,

//явное присвоение числа в указатель на функцию,

//это число интерпретируется как адрес и используется при вызове

return 0;

}

System.Delegate

System.MultiCastDelegate

Делегат – это класс, который инкапсулирует указатель на функцию а также интерфейс для работы с этим указателем.

Создание делегата:

  1. Объявить делегат.(Указывается : <Модификатор доступа>delegate тип возврата значения имя_делегата(параметры);)
  2. Тип_делегата имя экземпляра делегата = new тип_делегата(имя_функции);
  3. Вызов метода или списка методов делегатов.Имя экземпляра(параметы)

Example1

using System;

namespace NS

{

public delegate int myDel(params int[] arr);//любое количество интов

public delegate int myRef(ref int a);

public delegate int muOut(out int a);

public class A

{

public int Method(params int[] arr)

{

int sum=0;

foreach (int i in arr)

sum += i;

return sum;

}

public int Ref(ref int a)

{

return a *= a;

}

public int Out(out int a)

{

a = 10;

return a;

}

}

public class Tester

{

public static void Main()

{

myDel d = new myDel(new A().Method);

//как вариант, работает и передача готового проинициализированного массива

//int[] arr = { 1, 2, 3, 4, 5 };

//Random r = new Random();

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

//{

//    arr[i] = r.Next(10);

//}

Console.WriteLine( d(1,2,3));

//

int a = 5;

myRef r = new myRef(new A().Ref);

Console.WriteLine(r(ref a));

Console.WriteLine(a);

//

int b;

muOut del = new muOut(new A().Out);

Console.WriteLine(del(out b));

Console.WriteLine(b);

}

}

}

///////////////////////////////////////////////

Example2

using System;

public delegate void MyDel();

class Publisher

{

//public delegate void MyDel();

public MyDel delA,delB,delC;

public Publisher()

{

delA = new MyDel(A);

delB = new MyDel(B);

delC = new MyDel(C);

}

public void Starter()

{

delA();

delB();

delC();

}

public void A()

{

Console.WriteLine(“Method A is invoked”);

}

public void B()

{

Console.WriteLine(“Method B is invoked”);

}

public void C()

{

Console.WriteLine(“Method C is invoked”);

}

public void Hey(MyDel my)

{

my();

}

}

class Tester

{

static void Main()

{

Publisher pub = new Publisher();

pub.Starter();

Console.WriteLine();

pub.Hey(pub.delA);

pub.Hey(pub.delB);

pub.Hey(pub.delC);

}

}

MulticastDelegate – конструктор

///////////////////////////////////////

Список перегрузки

Имя     Описание

MulticastDelegate()     Инициализирует новый экземпляр класса MulticastDelegate.

MulticastDelegate(Object, String)       Инициализирует новый экземпляр класса MulticastDelegate.

MulticastDelegate(Type, String)          Инициализирует новый экземпляр класса MulticastDelegate.

////////////////////////////////////

Методы

Имя     Описание

Clone   Создает неполную копию делегата. (Унаследовано от Delegate.)

CombineImpl  Комбинирует данный Delegate с указанным Delegate для формирования нового делегата. (Переопределяет Delegate.CombineImpl(Delegate).)

DynamicInvoke          Динамически (с поздней привязкой) вызывает метод, представленный текущим делегатом. (Унаследовано от Delegate.)

DynamicInvokeImpl   Перегружен.

Equals Определяет, равны ли этот групповой делегат и указанный объект. (Переопределяет Delegate.Equals(Object).)

Finalize           Перегружен.

GetHashCode  Возвращает хэш-код данного экземпляра. (Переопределяет Delegate.GetHashCode().)

GetInvocationList       Возвращает список вызовов данного группового делегата в порядке вызова. (Переопределяет Delegate.GetInvocationList().)

GetMethodImpl           Перегружен.

GetObjectData Заполняет объект SerializationInfo всеми данными, необходимыми для сериализации данного экземпляра. (Переопределяет Delegate.GetObjectData(SerializationInfo, StreamingContext).)

GetType          Возвращает объект Type для текущего экземпляра. (Унаследовано от Object.)

MemberwiseClone      Создает неполную копию текущего объекта Object. (Унаследовано от Object.)

RemoveImpl   Удаляет элемент, равный указанному делегату, из списка вызовов данного MulticastDelegate. (Переопределяет Delegate.RemoveImpl(Delegate).)

ToString          Возвращает объект String, который представляет текущий объект Object. (Унаследовано от Object.)

///////////////////////////////////////

Свойства

Имя     Описание

Method            Возвращает метод, представленный делегатом. (Унаследовано от Delegate.)

Target  Возвращает экземпляр класса, метод которого вызывает текущий делегат. (Унаследовано от Delegate.)

public static Delegate Combine(Delegate d1, Delegate d1)  формирует список вызовов, состоящий из 2 делегатов

public static Delegate Combine(Delegate[] dls)   формирует список вызовов, состоящий из массива делегатов

public static Delegate Remove(Delegate source , Delegate value)  возвращает новый делегат, который получается при удалении делегата value из цепочки вызовов делегата source.

Для получения делегатов цепочки вызова используется метод класса GetlnvocationList();

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Reflection;

namespace asd//разработать класс калькулятор который содержит два метода

{//статический SUM и не статический Mul вызвать методы этого класса через дилегат

public delegate int DelCalc(int x,int y);

class calc

{

public static int sum( int x,  int y)

{

Console.WriteLine(“sum “+(x+y).ToString());

return x + y;

}

public int mul( int x,  int y)

{

Console.WriteLine(“mul” + (x * y).ToString());

return x * y;

}

}

class Program

{

public static void list(Delegate D)

{

foreach (Delegate i in D.GetInvocationList())

Console.WriteLine(i.Method.Name);

}

public static void Scan(Delegate D)

{

if (D.Target == null)

{

Console.WriteLine(“S Type: ” +  D.Method.DeclaringType.ToString());

Console.WriteLine(“Static”);

}

else

{

Console.WriteLine(“nonStatic”);

Console.WriteLine(” NS Type: ” + D.Target.GetType());

}

Console.WriteLine(“Name: “+D.Method.Name);

}

static void Main(string[] args)

{

DelCalc D = new DelCalc(new calc().mul);

Console.WriteLine(D(2,4));

D = new DelCalc(calc.sum);

Console.WriteLine(D(1,2));

DelCalc D2 = new DelCalc(new calc().mul);

D=(DelCalc)Delegate.Combine(D,D2);

D(1,2);

DelCalc.Remove(D, D2);

Console.WriteLine(“++++++++++++++++”);

D(1, 2); //D = new DelCalc(calc.sum);

Scan(D);

}

}

}

using System;

namespace ConsoleApplication1

{

public delegate bool CheckSomthing(); //обяъвление делегата

public static class Program

{

//класс, содержащий методы, которые будут вызываться с помощью делегата

class LeaveHome

{

bool w,l;

public LeaveHome(bool w, bool l)

{

this.w = w; this.l = l;

}

public bool checkWarter()

{

if (w)  Console.WriteLine(“Вода закрыта”);

else    Console.WriteLine(“Закрыть воду!!!”);

return w;

}

public bool checkLight()

{

if (l) Console.WriteLine(“Свет выключен”);

else   Console.WriteLine(“Выключить свет!!!”);

return l;

}

}

public static void Main()

{

LeaveHome lh = new LeaveHome(true,false);

CheckSomthing dlChain, dlWarter, dlLight;

dlLight = new CheckSomthing(lh.checkLight);

dlWarter = new CheckSomthing(lh.checkWarter);

//делегат dlChane должен использоваться для последовательного вызова

//методов  checkWarter и checkLight

//2 способа форирования цепочки делегатов

//метод Combine формирует список делегатов и записывает его и InvocationList dlChane

dlChain = (CheckSomthing)Delegate.Combine(dlLight, dlWarter);

dlChain();

Console.WriteLine(“Другой способ создания цепочки делегатов. Результат тот же.”);

//делегат dlChane изначально содержит метод checkLight,

//метод Combine добавляет в цепочку вызовов этого делегата делегат dlWarter

CheckSomthing dlChain1 = dlLight;

dlChain1 = (CheckSomthing)Delegate.Combine(dlChain1, dlWarter);

dlChain1();

}

}

}

////dlChain = dlWarter + dlLight; 1-ый вариант

//           //2-ой вариант

//            dlChain = null;

//            dlChain += dlWarter;

//            dlChain += dlLight;

//            dlChain(); //вызывется checkLight и checkWarter

//            dlChain -= dlWarter;

//            dlChain(); //вызывется только checkLight

//            dlChain -= dlLight;

//            dlChain(); //ошибка, т.к. dlChain = null

using System;

namespace ConsoleApplication1

{

public delegate bool CheckSomthing(); //обяъвление делегата

public static class Program

{

//класс, содержащий методы, которые будут вызываться с помощью делегата

class LeaveHome

{

bool w,l;

public LeaveHome(bool w, bool l)

{

this.w = w; this.l = l;

}

public bool checkWarter()

{

if (w)  Console.WriteLine(“Вода закрыта”);

else    Console.WriteLine(“Закрыть воду!!!”);

return w;

}

public bool checkLight()

{

if (l) Console.WriteLine(“Свет выключен”);

else   Console.WriteLine(“Выключить свет!!!”);

return l;

}

}

public static void Main()

{

LeaveHome lh = new LeaveHome(true,false);

CheckSomthing dlChain, dlWarter, dlLight;

dlLight = new CheckSomthing(lh.checkLight);

dlWarter = new CheckSomthing(lh.checkWarter);

//делегат dlChane должен использоваться для последовательного вызова

//методов  checkWarter и checkLight

//2 способа форирования цепочки делегатов

//метод Combine формирует список делегатов и записывает его и InvocationList dlChane

dlChain = (CheckSomthing)Delegate.Combine(dlLight, dlWarter);

dlChain();

Console.WriteLine(“Другой способ создания цепочки делегатов. Результат тот же.”);

//делегат dlChane изначально содержит метод checkLight,

//метод Combine добавляет в цепочку вызовов этого делегата делегат dlWarter

CheckSomthing dlChain1 = dlLight;

dlChain1 = (CheckSomthing)Delegate.Combine(dlChain1, dlWarter);

dlChain1();

CheckSomthing mine = delegate { Console.WriteLine(“HEllo anonim”); return true; };

mine();

}

}

}

////dlChain = dlWarter + dlLight; 1-ый вариант

//           //2-ой вариант

//            dlChain = null;

//            dlChain += dlWarter;

//            dlChain += dlLight;

//            dlChain(); //вызывется checkLight и checkWarter

//            dlChain -= dlWarter;

//            dlChain(); //вызывется только checkLight

//            dlChain -= dlLight;

//            dlChain(); //ошибка, т.к. dlChain = null

События

Событие – это класс который упращает работу с делегатами.

Этапы использование и работы с событиями:

1.Создание типа содержащего дополнительные данные для события.(необязателен)

2. Объявление делегата который задает сигнатуру метода для обработки события.

3.Объявить событие

<мод.доступа>event имя делегата имя события

4.создать метод уведомляющий подписчиков о возникновении события.

5.Создание метода генерирующего событие

A

/////////////////////////

using System;

using System.Collections.Generic;

using System.Threading;

namespace Strategy.RealWorld

{

class Publisher

{

public delegate void Del();

public event Del myEvent;

Del del;

public Publisher()

{

//сами подписываемся на собственное событие

del = new Del(Reaction);

this.myEvent += new Del(Reaction);

}

public void Method()

{

Random r = new Random();

while (true)

{

Thread.Sleep(500);

if (r.Next(10) == 5)

{

myEvent();

}

}

}

void Reaction()

{

Console.WriteLine(“I’ve sent the message!”);

}

}

class Tester

{

// Entry point into console application.

static void Main()

{

Publisher pub = new Publisher();

pub.Method();

}

}

}

////////////////////////////

В

/////////////////////////////////

using System;

using System.Collections.Generic;

using System.Threading;

namespace Strategy.RealWorld

{

//класс-издатель

class Publisher

{

//определение делегата

public delegate void Del();

public event Del OnEventHandler;

public Publisher()

{

this.OnEventHandler += new Del(Reaction);

}

public void Method()

{

Random r = new Random();

for(; ;)

{

Thread.Sleep(200);

if (r.Next(10) == 5)

{

OnEventHandler();

}

}

}

void Reaction()

{

Console.WriteLine(“I’ve sent the message!”);

}

}

//класс-подписчик

class Subscriber

{

public Subscriber(Publisher pub)

{

//подписываемся на событие другого класса

pub.OnEventHandler +=new Publisher.Del(Reaction1);

pub.OnEventHandler +=new Publisher.Del(Reaction2);

pub.Method();

}

void Reaction1()

{

Console.WriteLine(“I received the message”);

}

void Reaction2()

{

Console.WriteLine(“Oops! Here’s my e-mail!”);

}

}

class Tester

{

// Entry point into console application.

static void Main()

{

Publisher pub = new Publisher();

// pub.Method();

Subscriber sub = new Subscriber(pub);

}

}

}

////////////////////////////////———————

Нужно создать класс в котором есть метод который принимает число если это число отрицательное тогда статический метод класса программ а также не статический метод класса Х, должны выдать сообщение о том что они уведомлены о проишествии.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

//определяем делегат

public delegate void myDel();

class X

{

public void method()

{

Console.WriteLine(“X is take a message”);

}

}

class myClass

{

//объявлем событие

public event myDel MyEvent;

protected virtual void OnNagValue()

{

if (MyEvent != null)

MyEvent();

}

public void SetValue(int val)

{

if (val < 0) OnNagValue();

}

}

class Program

{

public static void method()

{

Console.WriteLine(“Program is take a message”);

}

static void Main(string[] args)

{

X x = new X();

myClass m = new myClass();

m.MyEvent += new myDel(x.method);

m.MyEvent += new myDel(Program.method);

m.SetValue(100); m.SetValue(-100);

}

}

}

Использование событий для передачи данных между объектами(реализация первого пункта)

Класс содержащие информацию о событиях, передаваемые обработчику события должны наследовать класс System.EventArgs

А имя типа должно заканчиватся словом EventArgs

Функции уведомляющие о событии а также функции обработки событий по договоренности имеют следующую сигнатуру.Функции возвращают void всегда и принимают два параметра:

  1. Ссылка на объект генерирующий событие.(тип Object)
  2. Объект наследующий тип EventArgs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

public delegate void myDel(Object ob, EventArgs E);

class MarkEventArgs : EventArgs

{

private int mark;

private string subject;

public MarkEventArgs(int m,string Sub)

{

mark = m;

subject = Sub;

}

public int mark1

{

get { return mark; }

set { mark = value; }

}

public string subject1

{

get { return subject; }

set { subject = value; }

}

}

class student

{

public event myDel GetMarksEvent;

protected virtual void OnGetMarksEvent(int m, string s)

{

if (GetMarksEvent != null)

{

GetMarksEvent(this,new MarkEventArgs(m,s));

}

}

public void SetMark(int m, string sub)

{

OnGetMarksEvent(m,sub);

}

}

class Parent

{

public void method(Object ob, EventArgs E)

{

if (((MarkEventArgs)E).mark1 < 6) Console.WriteLine(“;(“);

else Console.WriteLine(“;)”);

}

}

class GrandParent

{

public void method(Object ob, EventArgs E)

{

if (((MarkEventArgs)E).mark1 < 6) Console.WriteLine(“;-(“);

else Console.WriteLine(“;-)”);

}

}

class Program

{

static void Main(string[] args)

{

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Events2

{

public delegate void Del(Object ob, EventArgs E);

class Student

{

public event Del GetMarkEv;

protected virtual void OnGetMarkEv(int m, string s)

{

if (GetMarkEv != null)

{

GetMarkEv(this, new MarkEventArgs(m, s));

}

}

public void GetMark(int m,string s)

{

OnGetMarkEv(m,s);

}

}

class Parent

{

public void Method(Object ob, EventArgs E)

{

if(((MarkEventArgs)E).Mark<6)

Console.WriteLine(“Ну сына…ТЕБЕ ХАНА!!!”);

else

if(((MarkEventArgs)E).Mark<11)

Console.WriteLine(“Можно было и лучше…”);

else

Console.WriteLine(“Ну ладно, ладно…молодец”);

}

}

class GrandParent

{

public void Method(Object ob, EventArgs E)

{

if (((MarkEventArgs)E).Mark < 6)

Console.WriteLine(“Небоись внучек – исправиш!”);

else

if (((MarkEventArgs)E).Mark < 11)

Console.WriteLine(“МОЛОДЧИНА!!!”);

else

Console.WriteLine(“Какой же у нас умненький внучек! Маладец, так держать =)”);

}

}

class MarkEventArgs : EventArgs

{

private int _mark;

private string _subject;

public MarkEventArgs(int m, string s)

{

_mark = m;

_subject = s;

}

public int Mark

{

get { return _mark; }

set { _mark = value; }

}

public string Subject

{

get { return _subject; }

set { _subject = value; }

}

}

class Program

{

static void Main(string[] args)

{

Student S = new Student();

Parent P = new Parent();

GrandParent G = new GrandParent();

S.GetMarkEv += new Del(P.Method);

S.GetMarkEv += new Del(G.Method);

S.GetMark(11, “Math”);

}

}

}

1.      В классе Student реализовать событие, которое будет происходить, если студент пропустил более 3 занятий. В классе Parent реализовать обработку этого события.

2.      Реализовать 3 класса:

MailManager: ему передается сообщение, которое он рассылает всем подписчикам. Для рассылки использовать событие, на которое  подписываются все заинтересованные получатели.

Fax – класс получателя сообщений

Email – класс получателя сообщений.

В классах получателях реализовать:

- метод для подписки на событие

- метод для отмены подписки на событие

- метод обработки события, который печатает полученное сообщение

С сообщением должна передаваться следующая информация: имя отправителя, имя получателя, тема и текст сообщения.

Мой блог находят по следующим фразам

27 отзыва(-ов) »

  1. [...] DbParameter DbType c# типизированный [...]

  2. [...] c# IsPunctuation это [...]

  3. [...] C# переопределение Compare(T x, T y) [...]

  4. [...] п RefType, ValueType [...]

  5. [...] union – член класса Region C# [...]

  6. [...] gettypecode c# [...]

  7. [...] c# пустая строка cannot convert to system.int32 l [...]

  8. [...] сериализовать SortedList для передачи по wcf [...]

  9. MuhQuothFourl Gucci Bags lipidiova
    Ovabambinvalm Gucci handbags Seiseefly
    peerrerry Gucci UK Teenbypeimpom

  10. Super mega site

    http://liveinternet.ru

  11. [...] "system.collections.ienumerable" не содержит определения для &quot… [...]

  12. [...] произошла ошибка базового поставщика в open entity framework [...]

  13. [...] директива using для объявления переменных mydel,myevent [...]

  14. [...] Создать класс описывающий 2—х мерный массив.реализова… [...]

  15. [...] объявление 2мерных массивов констант с++ [...]

  16. [...] произошла базовай ошибка поставщика open entity framework [...]

  17. [...] произошла базовай ошибка поставщика open entity framework [...]

  18. [...] произошла базовай ошибка поставщика open entity framework [...]

  19. [...] произошла базовай ошибка поставщика open entity framework [...]

  20. [...] произошла базовай ошибка поставщика open entity framework [...]

  21. [...] произошла базовай ошибка поставщика open entity framework [...]

  22. [...] произошла базовай ошибка поставщика open entity framework [...]

  23. [...] произошла базовай ошибка поставщика open entity framework [...]

  24. [...] как binaryformatter сериализует enum wpf c# [...]

  25. [...] атрибут дя несериализации класса [...]

  26. [...] класс console в c# [...]

  27. [...] console.setcursorposition c# circle [...]

Оставить отзыв