Скачать презентацию Параметры и свойства Кафедра МОи АИС Скорнякова А Скачать презентацию Параметры и свойства Кафедра МОи АИС Скорнякова А

4. Свойства и параметры.pptx

  • Количество слайдов: 15

Параметры и свойства Кафедра МОи. АИС Скорнякова А. Ю. ayuskornyakova@mesi. ru Параметры и свойства Кафедра МОи. АИС Скорнякова А. Ю. ayuskornyakova@mesi. ru

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

Необязательные и именованные параметры private static void M(Int 32 x = 9, String s Необязательные и именованные параметры private static void M(Int 32 x = 9, String s = "a", Date. Time dt = default(Date. Time)) { Console. Write. Line("x={0}; s={1}; dt={2}", x, s, dt); } private static void Main(string[] args) { //x=9, s="a", dt=default(Date. Time) M(); //x=8, s="X", dt=default(Date. Time) M(8, "X"); //x=9, s="a dt =Date. Time. Now M(dt: Date. Time. Now); }

Неявно типизированные локальные переменные. (var) Локальным переменным вместо явного типа может быть задан определенный Неявно типизированные локальные переменные. (var) Локальным переменным вместо явного типа может быть задан определенный "тип" var. Ключевое слово var сообщает компилятору о необходимости определения типа переменной из выражения, находящегося с правой стороны оператора инициализации. Выводимый тип может быть встроенным, анонимным, пользовательским типом или типом, определенным в библиотеке классов платформы. NET Framework. var list = new List(); // list принадлежит типу List var count = 3; // count принадлежит типу int var greeting = "Hello"; // greeting принадлежит типу string var = 'c'; // var (в роли имени переменной) принадлежит типу 'char'

Неявно типизированные локальные переменные. (var) Ключевое слово var можно использовать в следующих контекстах: • Неявно типизированные локальные переменные. (var) Ключевое слово var можно использовать в следующих контекстах: • в локальных переменных (переменных, объявленных в области действия метода), как показано в предыдущем примере; • в операторе инициализации foreach; • в операторе using. Использование 'var' запрещено для объявления локальных переменных внутри методов или свойств, включая итерационные переменные в 'for' и 'foreach' выражениях. Это значит, что 'var' запрещено использовать в любом из следующих сценариев: • в качестве типа поля • в качестве типа параметра • в качестве типа возвращаемого методом или свойством • в качестве типа параметра в обобщенном типе или методе

Неявно типизированные локальные переменные. (var) • использование var принуждает вас более грамотно называть сами Неявно типизированные локальные переменные. (var) • использование var принуждает вас более грамотно называть сами переменные. • использование var принуждает к более качественному API. Вы получите оптимальные типы, когда позволяете компилятору получать самому тип возвращаемого значения метода или свойства. • использование var принуждает к инициализации переменных при их объявлении. • использование var приводит к уменьшению «шума» в коде. Если мы не используем var, то определение переменной через выражение new или cast требует указание типа дважды. • использование var позволяет уменьшить использование директивы using.

Передача параметров по ссылке (out & ref) Использование ключевого слово ref приводит к передаче Передача параметров по ссылке (out & ref) Использование ключевого слово ref приводит к передаче аргумента по ссылке, а не по значению. Эффект передачи по ссылке в том, что все изменения параметра метода отражаются на значении базовой переменной аргумента, используемой в вызове метода. Значение ссылочного параметра всегда совпадает со значением переменной базового аргумента. Ключевое слово out используется для передачи аргументов по ссылке. Оно похоже на ключевое слово ref, за исключением того, что ref требует инициализации переменной перед ее передачей. Для работы с параметром out определение метода и вызывающий метод должны явно использовать ключевое слово out. Например: static void Method(ref int i) { i = i + 44; } static void Main() { int val = 1; Method(ref val); Console. Write. Line(val); // Output: 45 } static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 }

Передача параметров по ссылке (out & ref) static void Some. Function 2(ref int a) Передача параметров по ссылке (out & ref) static void Some. Function 2(ref int a) { a = 55; } static void Some. Function 3(out int a) { a = 66; } public static void Main() { int z = 0; //Переменную z надо обязательно инициализировать Some. Function 2(ref z); Console. Write. Line(z); //Напечатается 55 int y; //Переменную y можно не инициализировать Some. Function 3(out y); Console. Write. Line(y); //Напечатается 66 }

Передача переменного количества аргументов. Модификатор params. • Ключевое слово params позволяет определить параметр метода, Передача переменного количества аргументов. Модификатор params. • Ключевое слово params позволяет определить параметр метода, принимающий переменное количество аргументов. • Можно отправить список аргументов типа, указанного в объявлении параметра, с разделителямизапятыми, или массив аргументов указанного типа. Можно также не отправлять аргументы. • В объявлении метода после ключевого слова params дополнительные параметры не допускаются. • В объявлении метода допускается только одно ключевое слово params. public static void Write(string label, params object[] args) { Console. Write. Line(label); for (int index = 0; index < args. Get. Length(0); index++) { Console. Write. Line(args[index]. To. String()); } } public static void Main() { Write("Port Test: ", "a", "b", 12, 14. 2); }

Свойства (Property) Свойство — это член, предоставляющий гибкий механизм для чтения, записи или вычисления Свойства (Property) Свойство — это член, предоставляющий гибкий механизм для чтения, записи или вычисления значения частного (private) поля. Свойства можно использовать, как если бы они являлись открытыми членами данных, хотя в действительности они являются специальными методами, называемыми методами доступа. Это обеспечивает простой доступ к данным и позволяет повысить уровень безопасности и гибкости методов. тип имя { get { // код аксессора для чтения из поля } set { // код аксессора для записи в поле } } • Cвойство не определяет место для хранения данных, и поэтому не может быть передано методу в качестве параметра ref или out. • Cвойство не подлежит перегрузке. Наличие двух разных свойств с доступом к одной и той же переменной допускается, но это, скорее, исключение, чем правило. • Cвойство не должно изменять состояние базовой переменной при вызове аксессора get. И хотя это ограничительное правило не соблюдается компилятором, его нарушение считается семантической ошибкой. Действие аксессора get не должно носить характер вмешательства в функционирование переменной.

Свойства class Program { public sealed class People { public String Name; // Имя. Свойства class Program { public sealed class People { public String Name; // Имя. public int Age; // Возраст. } public sealed class Employee { private String _name; private int _age; public String Name { get { return (_name); } set { _name = value; } } public int Age { get { return (_age); } set { if (value < 0) throw new Argument. Out. Of. Range. Exception( "value", value. To. String(Culture. Info. Invariant. Culture), "The value must be greater than or equal to 0" ); _age = value; } } public static void Main() { People pep = new People(); pep. Name = "Piter"; pep. Age = 41; } } public void Set. Age(int value) { if (value < 0) throw new Argument. Out. Of. Range. Exception( "value", value. To. String(Culture. Info. Invariant. Culture), "Возраст не может быть меньше 0"); Age = value; } } pep. Age = 41;

Автоматически реализуемые свойства тип имя { get; set; } При объявлении свойства компилятор создает Автоматически реализуемые свойства тип имя { get; set; } При объявлении свойства компилятор создает закрытое анонимное резервное поле, которое доступно только с помощью методов get и set свойства. private class Customer { public double Total. Purchases { get; set; } public string Name { get; private set; } protected int Customer. Id { get; private set; } }

Анонимные типы предлагают удобный способ инкапсулирования набора свойств только для чтения в один объект Анонимные типы предлагают удобный способ инкапсулирования набора свойств только для чтения в один объект без необходимости предварительного явного определения типа. Имя типа создается компилятором и недоступно на уровне исходного кода. Тип каждого из свойств выводится компилятором. var v = new { Amount = 108, Message = "Hello" }; Console. Write. Line(v. Amount + v. Message); public static void Main() { string my. Documents = Environment. Get. Folder. Path(Environment. Special. Folder. My. Documents); var query = from pathname in Directory. Get. Files(my. Documents) let last. Write. Time = File. Get. Last. Write. Time(pathname) where last. Write. Time > (Date. Time. Now - Time. Span. From. Days(7)) orderby last. Write. Time select new {Path = pathname, last. Write. Time}; foreach (var file in query) { Console. Write. Line("Last. Write. Time = {0}, Path = {1}", file. last. Write. Time, file. Path); } }

Свойства с параметрами. Индексаторы позволяют индексировать экземпляры класса или структуры так же, как массивы. Свойства с параметрами. Индексаторы позволяют индексировать экземпляры класса или структуры так же, как массивы. Индексаторы напоминают свойства, но их методы доступа принимают параметры. internal class My. Arr { private readonly int[] arr; public int Length; public My. Arr(int size) { arr = new int[size]; Length = size; } // Создаем простейший индексатор public int this[int index] { set { arr[index] = value; } get { return arr[index]; } } } internal class Program { private static void Main() { My. Arr arr 1 = new My. Arr(5); Random ran = new Random(); // Инициализируем каждый индекс //экземпляра класса arr 1 for (int i = 0; i < arr 1. Length; i++) { arr 1[i] = ran. Next(1, 100); Console. Write("{0}", arr 1[i]); } Console. Read. Line(); } }

Вопросы к экзамегну • Необязательные и именованные параметры • Неявно типизированные локальные переменные (var) Вопросы к экзамегну • Необязательные и именованные параметры • Неявно типизированные локальные переменные (var) • Передача параметров по ссылке (out, ref) • Модификатор params • Свойства без параметров, автоматически реализуемые свойства. • Анонимные типы • Свойства с параметрами. Индексаторы.