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


Категории:

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






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

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

Пример.

 

using System;

class Test

{

int x;

static int y;

void F()

{

x = 1; // Ok, same as this.x = 1

y = 1; // Ok, same as Test.y = 1

}

static void G()

{

x = 1; // Error, cannot access this.x

y = 1; // Ok, same as Test.y = 1

}

static void Main()

{

Test t = new Test();

t.x = 1; // Ok

t.y = 1; // Error, cannot access static member through instance

Test.x = 1; // Error, cannot access instance member through type

Test.y = 1; // Ok

}

}

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

Если объявление_поля включает модификатор 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, за которым следует ссылка на переменную того же типа, что и формальный параметр. Переменной не требуется быть определенно назначенной, прежде чем ее можно будет передать в качестве выходного параметра, но вслед за вызовом, в котором переменная была передана в качестве выходного параметра, эта переменная считается определенно назначенной.

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

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

Примеры.

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

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