СиППО (25-28, 42-45, 54-76) (Ответы на все вопросы), страница 6
Описание файла
Файл "СиППО (25-28, 42-45, 54-76)" внутри архива находится в папке "Ответы на все вопросы". Документ из архива "Ответы на все вопросы", который расположен в категории "". Всё это находится в предмете "системное и прикладное программное обеспечение (сппо)" из 6 семестр, которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "к экзамену/зачёту", в предмете "системное и прикладное программное обеспечение (сппо)" в общих файлах.
Онлайн просмотр документа "СиППО (25-28, 42-45, 54-76)"
Текст 6 страницы из документа "СиППО (25-28, 42-45, 54-76)"
set
{
// присвоение значения
}
}
Индексатор может иметь и атрибут доступа (по умолчанию как всегда private), индексатор public может обращаться и к массивам private.
Пример. Имеем класс Array и в нем массив a
namespace Index_1
{
class Array
{
int []a;
public int len;
public bool err;
public Array(int n)
{…}
//начинается описание индекса
public int this[int index]
{
get // возвращение значения элемента массива
{
if(ok(index))
{
err=false;
return a[index];
}
else
{
err=true;
return 0;
}
}
Set // присвоение значения элементу массива
{
if(ok(index))
{
a[index]=value;
err=false;
}
else
{
err=true;
}
}
}
bool ok(int index)
{
// вспомогательная функция, проверяет правильность индекса
}
}
class Class1
{
static void Main(string[] args)
{
Array c1=new Array(5);
for(int i=0;i<c1.len;i++)
c1[i]=2*i; // работает метод set
for(int i=0;i<c1.len;i++)
Console.WriteLine("Array["+i+"]="+c1[i]);
// работает метод get
Console.ReadLine();
}
}
}
Благодаря индексатору можно писать c1[i] вместо c1.a[i]. Кроме того, индексатор у нас имеет атрибут доступа public; если мы хотим обратиться к массиву без индексатора c1.a[i] то необходимо изменить и атрибут доступа массива.
Мы ограничились рассмотрением одномерного индексатора. Можно аналогичным образом ввести и многомерный индексатор (например, для двумерного массива).
61. Свойства на C#.
Свойства – это обобщение понятия данных. Значения свойств можно вычислить на основе значений данных, а также через свойство можно присвоить значения данным. Часто свойство вычисляют на базе нескольких или даже целого множества данных (например, свойство треугольника периметр – можно вычислить, зная его стороны; свойство – сумма элементов массива – на основе . . . ). В таком случае, естественно, вопрос о вычислении данных на основе значения свойства бессмысленный, так как эта задача не решается однозначно.
Определение свойства:
Тип_данных_свойства имя_свойства
{
get {
//получение значения свойства
}
set {
// использование переданного значения свойства
}
}
Пример на использование свойств.
namespace ConApp7
{
class Prop1
{
double[] mas;
double lim;
public Prop1()
{…}
double sum()
{//функция суммирования}
public double sum_prop
{ //свойство, значение которой вычисляется через функцию
get {
if (sum() > 0)
return sum();
else
return -25; }
}
public double lim_prop
{ // свойство, представляющее поле данных
get {return lim;}
set {
if (value > 0)
lim = value;
else
lim = 0; }
}
}
class Program
{
static void Main(string[] args)
{
Prop1 pr2=new Prop1();
// обращение к свойству для присвоения значения
pr2.lim_prop = 23.5;
// обращения к свойствам для получения значения
Console.WriteLine("Сумма " + pr2.sum_prop);
Console.WriteLine("Граница " + pr2.lim_prop);
Console.ReadLine();
}
}
}
При присвоении значений полям через свойства можно выполнять проверку корректности новых значений. К свойствам, значения которых должны вычисляться, обращаться легче по сравнению с обращением к функциям (не надо заботиться об аргументах). Как видно даже из этого простейшего примера, алгоритм вычисления значения свойства может быть записан как в самом свойстве, так и в функции, к которой обращается свойство. Кроме того, методика объектно-ориентированного программирования не рекомендует прямые обращения к полям. Те поля, к которым необходимо прямое обращение и которые, таким образом, входят в интерфейс класса, можно представить свойствами.
На использование свойств налагаются довольно серьезные ограничения. Свойству не соответствует поле памяти, оно лишь представляет данные. Поэтому его нельзя передавать методу в качестве ref- или out-параметра. Свойство не должно изменять состояние базовой переменной при вызове get.
62. Делегаты на C#.
Делегат — это объект, который может ссылаться на метод. Во время выполнения программы один и тот же делегат можно использовать для вызова различных методов, просто заменив метод, на который ссылается этот делегат. Таким образом, метод, который будет вызван делегатом, определяется не в период компиляции программы, а во время ее работы. Делегат в C# соответствует указателю на функцию в С++.
Общий вид объявления делегата:
delegate тип_возвращаемого_значения имя_делегата (список_формальных_параметров);
Для использования делегата должен быть объявлен указатель на делегата
Имя_делегата указатель_на_делегата;
и этот указатель должен быть инициирован:
указатель_на_делегата = new имя_делегата (имя_функции);
Здесь используется только имя функции (параметры не указываются).
Пример. Многоадресный делегат. Одному делегату можно ставить в соответствие несколько функций. В таком случае они будут выполнены в такой последовательности, как они были прикреплены к делегату.
namespace Deleg_2
{
delegate int Deleg(ref string st); // объявим делегат
class Class1
{
public static int met1(ref string x)
{
Console.WriteLine("I am Metod 1");
x+=" 11111";
return 5;
}
public static int met2(ref string y)
{
Console.WriteLine("I am Metod 2");
y+=" AAAAA";
return 55;
}
static void Main(string[] args)
{
Deleg d1;
int k;
string r="******";
Deleg d2=new Deleg(met1);
// связываем делегат и функцию
Deleg d3=new Deleg(met2);
d1=d2; // присоединим первый делегат
d1+=d3; // добавим второй делегат
k=d1(ref r);
Console.WriteLine(r);
Console.WriteLine("k=" + k);
Console.ReadLine();