Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






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

Классы.

Класс — это структура данных, которая может содержать члены данных (константы и поля), члены функций (методы, свойства, события, индексаторы, операторы, конструкторы экземпляров, деструкторы и статические конструкторы) и вложенные типы. Типы классов поддерживают наследование — механизм, в котором производный класс может расширять и сужать базовый класс (Спецификация языка).

Объявлением класса является объявление типа, которое объявляет новый класс.

Объявление класса:
атрибутынеобязательно модификаторы_классанеобязательно partialнеобязательно class идентификатор список_параметров_типанеобязательно
база_классанеобязательно предложения_ограничений_параметров_типанеобязательно тело_класса ;необязательно

Объявление класса состоит из необязательного набора атрибутов, затем следует необязательный набор модификаторов класса, необязательный модификатор partial, ключевое слово class и идентификатор, именующий класс, затем следует необязательный список параметров типа, необязательная спецификация базы класса, необязательный набор предложений ограничений параметров типа, тело класса и необязательная точка с запятой.

Объявление класса не предоставляет предложения ограничений параметров типа, если не предоставляется список параметров типа.

Объявление класса, предоставляющее список параметров типа, является объявлением универсального класса.

Модификаторы класса.

Объявление класса может включать последовательность модификаторов класса:

new
public
protected
internal
private
abstract
sealed

static
Появление в объявлении класса одного и того же модификатора несколько раз является ошибкой времени компилирования. Модификатор new допускается во вложенных классах. Модификаторы public, protected, internal и private управляют доступностью класса. В зависимости от контекста, в котором возникает объявление класса, некоторые из данных модификаторов могут быть запрещены. По умолчанию модификатором класса является модификатор internal. Пример.

using System;

 

namespace ConsoleApplication11

{

class myclass

{

 

}

class Program

{

static void Main(string[] args)

{

myclass obj = new myclass();

}

}

}

 

Пример. Объявление класса с модификатором private (protected). Данный код приведет к ошибке:

using System;

 

namespace ConsoleApplication11

{

private class myclass

{

 

}

class Program

{

static void Main(string[] args)

{

myclass obj = new myclass();

}

}

}

Ошибка 1 Элементы, определенные в пространстве имен, не могут объявляться в явном виде как частные, защищенные или защищенные внутренние

Следующий код не приведет к ошибке. Здесь класс myclass объявленный с модификатором private является вложенным классом.

Using System;

 

namespace ConsoleApplication11

{

class Program

{

private class myclass

{

 

}

static void Main(string[] args)

{

myclass obj = new myclass();

}

}

}

 

Абстрактные классы.

Модификатор abstract используется для указания незавершенности класса и необходимости его использования только в качестве базового класса. Использование оператора new в абстрактном классе является ошибкой времени компилирования.

Пример. Следующий код приведет к ошибке:

using System;

 

namespace ConsoleApplication11

{

 

class Program

{

abstract class myclass

{

 

}

static void Main(string[] args)

{

myclass obj = new myclass();

}

}

}

Ошибка 1 Невозможно создать экземпляр абстрактного класса или интерфейса.

Можно иметь переменные и значения, имеющие типы времени компиляции, являющиеся абстрактными типами, такие переменные и значения будут обязательно иметь значение null или будут содержать ссылки на экземпляры неабстрактных классов, производных от абстрактных типов.

Пример.

Нельзя создать экземпляр абстрактного класса Brush

Код

Brush mybrash = new Brush();

Приведет к ошибке.

Можно создать переменную типа Brush, которая будет содержать ссылку, например, на экземпляр неабстрактного класса SolidBrush, производного от абстрактного класса Brush:

 

 

 

private void Form1_Paint(object sender, PaintEventArgs e)

{

Brush mybrash = new SolidBrush(Color.Chocolate);

Graphics g = e.Graphics;

g.FillEllipse(mybrash, 100, 100, 30, 30);

}

 

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

using System;

 

namespace ConsoleApplication12

{

abstract class myCar

{

abstract public void DescribeCar();

}

 

class Car : myCar

{

public override void DescribeCar()

{

System.Console.WriteLine(“Four wheels and an engine.”);

}

}

 

class TestClass

{

static void Main()

{

Car car1 = new Car();

car1.DescribeCar();

System.Console.WriteLine(«----------«);

 

}

}

}

 

Абстрактные методы не имеют реализации, поэтому определение такого метода заканчивается точкой с запятой.

Класс Car переопределяет DescribeCar и обеспечивает фактическую реализацию. Так как в классе Car нет абстрактных членов, класс Car может быть (но не должен) быть абстрактным.

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

 

Запечатанные классы.

Модификатор sealed используется для предотвращения создания из него производных классов. Если запечатанный класс указывается в качестве базового класса другого класса, возникает ошибка времени компилирования. Пример:

class A { }

sealed class B : A { }

class C : B { }

Ошибка 1 нельзя наследовать от запечатанного типа

Запечатанный класс не может быть также абстрактным классом.

Модификатор sealed в первую очередь используется для предотвращения непреднамеренного создания из него производных классов. Так как запечатанный класс не имеет производных классов, можно преобразовать вызовы виртуальной функции-члена экземпляров запечатанного класса в невиртуальные вызовы. Пример:

class X

{

protected virtual void F() { Console.WriteLine("X.F"); }

protected virtual void F2() { Console.WriteLine("X.F2"); }

}

class Y : X

{

sealed protected override void F() { Console.WriteLine("Y.F"); }

protected override void F2() { Console.WriteLine("X.F3"); }

}

class Z : Y

{

// Ошибка 1 : невозможно переопределить наследуемый член поскольку он запечатан

// protected override void F() { Console.WriteLine("C.F"); }

// Overriding F2 is allowed.

protected override void F2() { Console.WriteLine("Z.F2"); }

}

Статические классы.

 

Класс можно определить с ключевым словом static

Не реализует никаких интерфейсов.

Можно определять только статические члены.

Статический класс не может содержать члены с объявленной доступностью protected или protected internal.

Нельзя создавать экземпляры статического класса.

Доступ к членам статического класса осуществляется с использованием имени класса

Класс нельзя использовать в качестве параметра метода или локальной переменной.

Статический класс не может содержать модификатор sealed или abstract.

Нарушение данных ограничений приводит к ошибке времени компилирования.

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

Члены статического класса автоматически не являются статическими, а объявления членов должны явно включать модификатор static (исключая константы и вложенные типы).

 

Тело класса

Тело класса для класса определяет члены этого класса.

тело_класса:
{ объявления_члена_классанеобязательно }

Члены класса.

Члены типа класса разделены на следующие категории (спецификация)

· Константы, представляющие постоянные значения, связанные с классом.

· Поля, являющиеся переменными класса.

· Методы, реализующие вычисления и действия, которые могут быть выполнены классом.

· Свойства, определяющие именованные характеристики и действия, связанные с чтением и записью данных характеристик.

· События, определяющие уведомления, которые могут быть сгенерированы классом.

· Индексаторы, которые обеспечивают индексацию экземпляров класса аналогично (синтаксически) индексации массивов.

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

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

· Деструкторы, реализующие действия, выполняемые до отмены экземпляров класса без возможности восстановления.

· Статические конструкторы, реализующие действия, требуемые для инициализации самого класса.

· Типы, представляющие локальные типы класса.

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

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

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

 

Члены класса являются либо статическими членами, либо членами экземпляра. В общем случае считается, что статические члены принадлежат к типам классов, а члены экземпляра принадлежат к объектам (экземплярам типов классов).

Каждый экземпляр класса содержит отдельный набор всех полей экземпляра класса.

Член функции экземпляра (метод, свойство, индексатор, конструктор экземпляра или деструктор) работает на заданном экземпляре класса, и данный экземпляр может быть вызван в качестве this.

 

 

Класс может содержать объявления следующих членов:

class-member: Члены класса declaration
constant Константа     attributesopt constant-modifiersopt const type constant-declarators ;    
field Поле Static and instance fields   attributesopt field-modifiersopt type variable-declarators ;   атрибутынеоб модификаторы_полянеоб тип деклараторы_переменных ;  
method Метод method-header: attributesopt method-modifiersopt partialopt return-type member-name type-parameter-listopt ( formal-parameter-listopt ) type-parameter-constraints-clausesopt public static void OpTest<T>(T s, T t)
property Свойство property-declaration: attributesopt property-modifiersopt type member-name { accessor-declarations } get-accessor-declaration: attributesopt accessor-modifieropt get accessor-body set-accessor-declaration: attributesopt accessor-modifieropt set accessor-body
event Событие attributesopt event-modifiersopt event type variable-declarators ; public event EventHandler Click;
indexer Индексатор indexer-declaration: attributesopt indexer-modifiersopt indexer-declarator { accessor-declarations } indexer-declarator: type this [ formal-parameter-list ] type interface-type . this [ formal-parameter-list ]
operator Операторы attributesopt operator-modifiers operator-declarator operator-body
constructor Конструктор экземпляра attributesopt constructor-modifiersopt constructor-declarator constructor-body
destructor деструктор attributesopt externopt ~ identifier ( ) destructor-body
static-constructor Конструктор типа static-constructor-declaration: attributesopt static-constructor-modifiers identifier () static-constructor-body
type типы  

 

 

Конструкторы экземпляров.

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

объявление_конструктора:
атрибутынеобязательно модификаторы_конструкторанеобязательно декларатор_конструктора тело_конструктора

модификатор_конструктора:
public
protected
internal
private
extern

декларатор_конструктора:
идентификатор ( список_формальных_параметровнеобязательно ) инициализатор_конструкторанеобязательно

инициализатор_конструктора:
: base ( список_аргументовнеобязательно )
: this ( список_аргументовнеобязательно )

тело_конструктора:
блок
;

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

 

Необязательный список формальных параметров конструктора экземпляров подчиняется тем же правилам, что и список формальных параметров метода. Список формальных параметров определяет подпись конструктора экземпляров и управляет процессом, посредством которого разрешение перегрузки выбирает отдельный конструктор экземпляров в вызове.

Каждый тип, на который есть ссылка в списке формальных параметров конструктора экземпляров, должен быть, по крайней мере, так же доступным, как сам конструктор.

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

Конструкторы экземпляров не наследуются.

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

Инициализаторы конструкторов.

Все конструкторы экземпляров (за исключением конструкторов для класса object) неявно включают вызов другого конструктора экземпляров непосредственно перед телом конструктора. Конструктор, который должен быть неявно вызван, определяется инициализатором конструктора:

инициализатор конструктора экземпляров вида base(список_аргументовнеоб) побуждает вызов конструктора экземпляров из базового класса.

инициализатор конструктора экземпляров вида this(список_аргументовнеоб) побуждает вызов конструктора экземпляров из самого класса

Если у конструктора экземпляров нет инициализатора конструктора, неявно предоставляется инициализатор конструктора вида base().

 

Выполнение конструктора

Инициализаторы переменных преобразуются в операторы присваивания, и эти операторы присваивания выполняются перед вызовом конструктора экземпляров базового класса. Этот порядок обеспечивает инициализацию всех полей экземпляра их инициализаторами переменных до выполнения каких-либо операторов, имеющих доступ к этому экземпляру.

Пример.

 

using System;

 

namespace ConsoleApplication12

{

 

class A

{

public A()

{

PrintFields();

}

public virtual void PrintFields() { }

}

class B : A

{

int x = 1;

int y;

public B()

{

y = -1;

}

public override void PrintFields()

{

Console.WriteLine("x = {0}, y = {1}", x, y);

}

}

 

class Program

{

 

static void Main(string[] args)

{

B b = new B();

}

}

}

 

В этом примере, если new B() используется для создания экземпляра B, создается следующий вывод:

x = 1, y = 0

 

Конструкторы по умолчанию

Конструктор по умолчанию создается автоматически если нет явно заданных конструкторов.

Конструкторы экземпляров для ссылочного типа создаются с модификатором public. Тип может определять несколько конструкторов с различными сигнатурами.

Статические конструкторы

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

объявление_статического_конструктора:
атрибутынеобязательно модификаторы_статического_конструктора идентификатор ( ) тело_статического_конструктора

модификаторы_статического_конструктора:
externнеобязательно static
static externнеобязательно

тело_статического_конструктора:
блок
;

Объявление_статического_конструктора может включать набор атрибутов и модификатор extern.

Идентификатор в объявлении_статического_конструктора должен указывать имя класса, в котором объявлен статический конструктор. Если указано любое другое имя, происходит ошибка времени компиляции.

Если в объявление статического конструктора включен модификатор extern, статический конструктор называется внешним статическим конструктором. Так как объявление внешнего статического конструктора не предоставляет фактическую реализацию, его тело_статического_конструктора состоит из точки с запятой. Для всех других объявлений статического конструктора тело_статического_конструктора состоит из блока, в котором указаны операторы, которые необходимо выполнить, чтобы инициализировать класс.

Статические конструкторы не наследуются и их нельзя вызвать непосредственно.

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

· создан экземпляр типа класса;

· возникла ссылка на любой статический член типа класса.

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

Для инициализации нового закрытого типа класса сначала создается новый набор статических полей для этого особого типа класса. Каждое из статических полей инициализируется своим значением по умолчанию . Затем выполняются инициализаторы этих статических полей . Наконец выполняется статический конструктор.

 

Пример.

using System;

 

namespace ConsoleApplication12

{

 

class SimpleClass

{

// Static variable that must be initialized at run time.

static readonly long baseline;

 

// Static constructor is called at most one time, before any

// instance constructor is invoked or member is accessed.

static SimpleClass()

{

baseline = DateTime.Now.Ticks;

}

}

 

class Program

{

 

static void Main(string[] args)

{

SimpleClass scl = new SimpleClass();

 

}

}

}

 

Статический конструктор не принимает модификаторы доступа и не имеет параметров.

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

Статический конструктор нельзя вызывать напрямую.

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

Константы

Константа – это член класса, представляющий постоянное значение: значение, которое может быть вычислено во время компиляции. Объявление_константы

объявление_константы:
атрибутынеоб модификаторы_константнеоб const тип деклараторы_констант ;

модификатор_константы:
new
public
protected
internal
private

деклараторы_констант:

 

идентификатор = выражение_константы

Константы считаются статическими членами, объявление_константы не требует и не допускает модификатор static.

Тип, указанный в объявлении константы, должен быть типом sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string.

Пример const локальная переменная

using System;

class Program

{

static void Main(string[] args)

{

const int months = 12;

Console.WriteLine(months);

}

}

 

Пример const поле

 

using System;

class Calendar

{

public const int months = 12;

}

class Program

{

static void Main(string[] args)

{

int birthstones = Calendar.months;

Console.WriteLine(birthstones);

}

}

Поля.

Поле – это член, представляющий переменную, связанную с объектом или классом. Объявление_поля вводит одно или более полей заданного типа.

объявление_поля:
атрибутынеоб модификаторы_полянеоб тип деклараторы_переменных ;

модификатор_поля:
new
public
protected
internal
private
static
readonly
volatile

декларатор_переменной:
идентификатор = инициализатор_переменной

инициализатор_переменных:
выражение
инициализатор_массива

Объявление поля может включать модификатор readonly или volatile, но не оба.

Декларатор переменной состоит из идентификатора, именующего член, за которым необязательно следуют лексема «=» и инициализатор переменной, задающий начальное значение члена.

Тип поля должен быть, по крайней мере, таким же доступным, как само поле.

Значение поля получается в выражении с помощью простого имени или доступа к члену.

Значение поля с доступом не только для чтения изменяется с помощью присваивания.

Значение поля с доступом не только для чтения можно и получать, и изменять с помощью операторов постфиксного увеличения и уменьшения и операторов префиксного увеличения и уменьшения.

Объявление поля, объявляющее несколько полей, эквивалентно нескольким объявлениям одиночных полей с теми же атрибутами, модификаторами и типом. Пример.

class A
{
public static int X = 1, Y, Z = 100;
}

эквивалентно

class A
{
public static int X = 1;
public static int Y;
public static int Z = 100;
}

Поля только для чтения.

Если объявление_поля включает модификатор readonly, поля, введенные этим объявлением, являются полями только для чтения.

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

Например:

public class ReadOnlyTest

{

class SampleClass

{

public int x;

// Initialize a readonly field

public readonly int y = 25;

public readonly int z;

 

public SampleClass()

{

// Initialize a readonly instance field

z = 24;

}

 

public SampleClass(int p1, int p2, int p3)

{

x = p1;

y = p2;

z = p3;

}

}

static void Main()

{

SampleClass p1 = new SampleClass(11, 21, 32); // OK

Console.WriteLine("p1: x={0}, y={1}, z={2}", p1.x, p1.y, p1.z);

SampleClass p2 = new SampleClass();

p2.x = 55; // OK

Console.WriteLine("p2: x={0}, y={1}, z={2}", p2.x, p2.y, p2.z);

}

}

Ответ

 

Поле static readonly полезно, если требуется символическое имя для значения константы, но тип значения недопустим в объявлении const, или если значение не может быть вычислено во время компиляции. Пример.

public class Color

{

public Color Black = new Color(0, 0, 0);

public static readonly Color White = new Color(255, 255, 255);

public static readonly Color Red = new Color(255, 0, 0);

public static readonly Color Green = new Color(0, 255, 0);

public static readonly Color Blue = new Color(0, 0, 255);

private byte r, g, b;

public Color(byte r, byte g, byte b)

{

this.r = r;

this.g = g;

this.b = b;

}

}

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

Инициализация поля.

Начальным значением поля, как статического, так и поля экземпляра, является значение по умолчанию типа поля. Невозможно видеть значение поля до выполнения этой инициализации по умолчанию, и поэтому поле никогда не бывает «неинициализированным». Пример.

using System;

class Test
{
static bool b;
int i;

static void Main() {
Test t = new Test();
Console.WriteLine("b = {0}, i = {1}", b, t.i);
}
}

В этом примере производятся следующие выходные данные

b = False, i = 0

так как и b, и i автоматически инициализированы значениями по умолчанию.

 

Объявления полей могут включать инициализаторы_переменных. Для статических полей инициализаторы переменных соответствуют операторам присваивания, выполняемым во время инициализации класса. Для полей экземпляров инициализаторы переменных соответствуют операторам присваивания, выполняемым при создании экземпляра класса.

Пример.

using System;

class Test
{
static double x = Math.Sqrt(2.0);
int i = 100;
string s = "Hello";

static void Main() {
Test a = new Test();
Console.WriteLine("x = {0}, i = {1}, s = {2}", x, a.i, a.s);
}
}

Методы

Метод – это член, реализующий вычисление или действие, которое может быть выполнено объектом или классом. Методы объявляются с помощью объявлений_методов:

объявление_метода:
заголовок_метода тело_метода

заголовок_метода:
атрибутынеобязательно модификаторы_методанеобязательно partialнеобязательно тип_возвращаемого_значения имя_элемента список_параметров_типанеобязательно
( список_формальных_параметровнеобязательно ) предложения_ограничений_параметров_типанеобязательно

модификатор_метода:
new
public
protected
internal
private
static
virtual
sealed
override
abstract
extern

возвращаемый_тип:
тип
void

имя_элемента:
идентификатор
тип_интерфейса . идентификатор

тело_метода:
блок
;

Объявление_метода может включать набор атрибутов и допустимое сочетание из четырех модификаторов доступа, и модификаторы new, static, virtual, override, sealed, abstract и extern.

Объявление имеет допустимое сочетание модификаторов, если верно все следующее:

· объявление включает допустимое сочетание модификаторов доступа;

· объявление не включает один и тот же модификатор несколько раз;

· объявление включает не более одного из следующих модификаторов: static, virtual и override;

· объявление включает не более одного из следующих модификаторов: new и override;

· если объявление включает модификатор abstract, то объявление не включает ни один из следующих модификаторов: static, virtual, sealed и extern;

· если объявление включает модификатор private, то объявление не включает ни один из следующих модификаторов: virtual, override и abstract;

· если объявление включает модификатор sealed, то объявление также включает модификатор override;

· если объявление включает модификатор partial, то оно не включает ни один из следующих модификаторов: new, public, protected, internal, private, virtual, sealed, override, abstract и extern.

Тип_возвращаемого_значения в объявлении метода указывает тип значения, вычисляемого и возвращаемого методом. Если метод не возвращает значение, типом_возвращаемого_значения является void.

Имя_члена указывает имя метода. Если только метод не является членом явной реализации интерфейса, имя_члена – это просто идентификатор. Для члена явной реализации интерфейса имя_члена состоит из типа_интерфейса, за которым следует «.» и идентификатор.

Необязательный список_формальных_параметров указывает параметры метода.

Для методов abstract и extern тело_метода состоит просто из точки с запятой.

Сигнатура метода состоит из его имени, числа параметров типов и числа, модификаторов и типов его формальных параметров.

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

Все формальные параметры и параметры типов должны иметь разные имена.

Параметры метода

Параметры метода, если они имеются, объявляются списком формальных параметров метода.

список_формальных_параметров:

фиксированные_параметры , массив_параметров

 

фиксированный_параметр:
атрибутынеобязательно модификатор_параметранеобязательно тип идентификатор аргумент_по_умолчаниюнеобязательно

аргумент_по_умолчанию:
= выражение

модификатор_параметра:
ref
out
this

массив_параметров:
атрибутынеобязательно params тип_массива идентификатор

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

В примере демонстрируются разные виды параметров.

public void M(ref int i, decimal d,bool b = false, bool? n = false, string s = "Hello",

object o = null,params int[] a) { }

 

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

Есть четыре вида формальных параметров:

· параметры по значению, объявляемые без модификаторов;

· параметры по ссылке, объявляемые с модификатором ref;

· выходные параметры, объявляемые с модификатором out;

· массивы параметров, объявляемые с модификатором params.

Параметры по значению

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

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

Параметры по ссылке

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

Если формальный параметр является параметром по ссылке, соответствующий аргумент в вызове метода должен состоять из зарезервированного слова ref, за которым следует ссылка на переменную того же типа, что и формальный параметр. Переменная должна быть определенно назначенной до того, как ее можно будет передать в качестве параметра по ссылке.

Внутри метода параметр по ссылке всегда считается определенно назначенным.

Выходные параметры

Параметр, объявленный с модификатором out, является выходным параметром. Подобно параметру по ссылке, выходной параметр не создает новое место хранения. Вместо этого выходной параметр представляет то же самое место хранения, что и переменная, заданная в качестве аргумента при вызове метода.

Если формальный параметр является выходным параметром, соответствующий аргумент в вызове метода должен состоять из зарезервированного слова out, за которым следует ссылка на переменную того же типа, что и формальный параметр. Переменной не требуется быть определенно назначенной, прежде чем ее можно будет передать в качестве выходного параметра, но вслед за вызовом, в котором переменная была передана в качестве выходного параметра, эта переменная считается определенно назначенной.

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

Каждый выходной параметр метода должен быть определенно назначен до возврата из метода.

Примеры.

Тело метода

Тело_метода содержит блок или точку с запятой.

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

В теле метода, который имеет тип возвращаемого значения void, не допускается использование операторов return для задания выражений.

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

 

Свойства.

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

Свойства объявляются с помощью объявлений_свойств:

объявление_свойства:
атрибутынеобязательно модификаторы_свойствнеобязательно тип имя_члена { объявления_методов_доступа }

модификатор_свойства:
new
public
protected
internal
private
static
virtual
sealed
override
abstract
extern

имя_элемента:
идентификатор
тип_интерфейса . идентификатор

Тип свойства задает представленный в объявлении тип свойства. Имя члена задает имя свойства. Если в свойстве не содержится явная реализация члена интерфейса, имя члена представляет собой просто идентификатор. При явной реализации члена интерфейса имя члена состоит из типа интерфейса, точки «.» и идентификатора (в указанной последовательности).

Объявления методов_доступа заключаются в фигурные скобки «{» и «}» и объявляют методы доступа свойства. Методы доступа задают исполняемые операторы, связанные с чтением или записью свойства.

Несмотря на то, что для обращения к свойствам и полям используется одинаковый синтаксис, свойство не классифицируется как переменная. Поэтому невозможно передать свойство как аргумент ref или out.

Методы доступа

Объявления_методов_доступа свойства задают исполняемые операторы, связанные с чтением или записью свойства.

объявления_методов_доступа:
объявление_метода_доступа_get объявление_метода_доступа_setнеобязательно
объявление_метода_доступа_set объявление_метода_доступа_getнеобязательно

объявление_метода_доступа_get:
атрибутынеобязательно модификатор_метода_доступанеобязательно get тело_метода_доступа

объявление_метода_доступа_set:
атрибутынеобязательно модификатор_метода_доступанеобязательно set тело_метода_доступа

модификатор_метода_доступа:
protected
internal
private
protected internal
internal protected

тело_метода_доступа:
блок
;

Объявление метода доступа включает в себя объявление_метода_доступа_get, объявление_метода_доступа_set или оба этих объявления. Каждое объявление метода доступа состоит из маркера get или set, за которым следуют необязательный модификатор метода доступа и тело метода доступа.

Свойство, содержащее оба метода доступа (get и set), называется свойством для чтения и записи.

Методы доступа get и set свойства не являются отдельными членами и не могут объявляться отдельно от свойства.

 

Классы.

Класс — это структура данных, которая может содержать члены данных (константы и поля), члены функций (методы, свойства, события, индексаторы, операторы, конструкторы экземпляров, деструкторы и статические конструкторы) и вложенные типы. Типы классов поддерживают наследование — механизм, в котором производный класс может расширять и сужать базовый класс (Спецификация языка).

Объявлением класса является объявление типа, которое объявляет новый класс.

Объявление класса:
атрибутынеобязательно модификаторы_классанеобязательно partialнеобязательно class идентификатор список_параметров_типанеобязательно
база_классанеобязательно предложения_ограничений_параметров_типанеобязательно тело_класса ;необязательно

Объявление класса состоит из необязательного набора атрибутов, затем следует необязательный набор модификаторов класса, необязательный модификатор partial, ключевое слово class и идентификатор, именующий класс, затем следует необязательный список параметров типа, необязательная спецификация базы класса, необязательный набор предложений ограничений параметров типа, тело класса и необязательная точка с запятой.

Объявление класса не предоставляет предложен

Последнее изменение этой страницы: 2016-08-29

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...