Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка для КР по ООП.doc
Скачиваний:
8
Добавлен:
18.04.2019
Размер:
2.47 Mб
Скачать

Main в классе. Точка входа

Без статической функции (метода) Main невозможно построить выполняемую программу. Без явно обозначенной точки входа сборка не можен выполняться.

В сборке можно располагать несколько классов. Каждый класс располагает собственным набором методов. В каждом классе могут располагаться одноименные методы. В следующем примере объявляются три класса в одном пространстве имён. В каждом классе объявляется независимая точка входа. Три (!) СТАТИЧЕСКИЕ функции Main. Возможно и такое. При этом главная проблема - при компиляции надо явным образом указать точку входа.

  • Это можно сделать из командной строки при вызове компилятора. Например, так:

c:\ csc /main:Class1.Class3 Example1.cs

  • Можно через диалог The Startup Object property среды разработки приложений (меню Проект-Свойства проекта, далее - General, Common Properties, <Projectname> Property Pages Dialog Box (Visual C#)), который обеспечивает спецификацию значений, которые явным образом НЕ ПРОПИСАНЫ в проекте. В разделе Startup object, надо раскрыть список классов и указать соответствующий класс.

Транслятор соберёт сборку, В которой будет обеспечена передача управления соответствующей функции Main (одной из трёх!).

using System;

namespace Example1

{

//===============================================

public class Class1

{

// Спецификатор public нужен здесь. Третий класс.

public class Class3

{

public static void Main()

{

string[] sss = new string[]{Class1.s.ToString(),”12345”};

Class1.Main(sss);

}

}

int d = 0;

public static int s;

static void Main(string[] args)

{

Class1 c1 = new Class1();

f1(c1);

c1.f2();

Class2 c2 = new Class2();

//c2.f2();

c2.f3();

string[] sss = new string[] {”qwerty”, c1.ToString()};

Class2.Main(sss);

}

static void f1(Class1 x)

{

//x.s = 100;

s = 0;

Class1.s = 125;

x.d = 1;

//d = 100;

}

void f2()

{

s = 0;

Class1.s = 100;

//this.s = 5;

//Class1.d = 125;

this.d = 100;

d = 100;

}

}

//===============================================

class Class2

{

int d;

static int s;

public static void Main(string[] args)

{

Class1.Class3.Main();

Class2 c2 = new Class2();

f1(c2);

c2.f2();

//Class1.Main();

}

static void f1(Class2 x)

{

//x.s = 100;

s = 0;

Class2.s = 125;

x.d = 1;

//d = 100;

}

void f2()

{

s = 0;

Class1.s = 100;

//this.s = 5;

//Class1.d = 125;

this.d = 100;

d = 100;

}

public void f3()

{

s = 0;

Class1.s = 100;

//this.s = 5;

//Class1.d = 125;

this.d = 100;

d = 100;

}

}

//===============================================

}

Структура также может иметь свою точку входа!

using System;

namespace defConstructors

{

struct MyStruct

{

static void Main(string[] args)

{

Console.WriteLine(“Ha-ha-ha”);

}

}

}

Создание объекта. Конструктор

Конструктором называется группировка кода, которой передаётся управление при создании объекта. Синтаксис объявления конструктора аналогичен обявлению метода. Те же спецификаторы доступа, имя, список параметров. Особенности конструктора заключаются в том, что:

  • конструктор НЕ ИМЕЕТ НИКАКОГО спецификатора возвращаемого даже void,

  • имя конструктора полностью совпадает с именем класса или структуры,

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

  • не существует выражения вызова для конструктора, управление в конструктор передаётся посредством выполнения специальной операции new.

В C# ключевое слово new может быть использовано как ОПЕРАЦИЯ или как МОДИФИКАТОР.

new как операция используется:

  • для ссылочных типов (типов-ссылок) при создании объектов в уравляемой памяти и передачи управления конструкторам,

  • для размерных типов (типов-значений) при создании объектов в СТЕКЕ. Возможно, что при этом может потребоваться обращение к конструктору.

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