Если объявление свойства включает модификатор static, свойство называется статическим свойством. Если модификатор static отсутствует, свойство называется свойством экземпляра.
Статическое свойство не связано с конкретным экземпляром. При использовании зарезервированного слова this в методах доступа статического свойства возникает ошибка времени компиляции.
Свойство экземпляра связано с заданным экземпляром класса, обращение к которому может выполняться с помощью зарезервированного слова this в методах доступа свойства.
При доступе к члену с использованием ссылки на свойство в форме E.M для статического свойства M параметр E должен означать тип, содержащий M, а для свойства экземпляра M — экземпляр типа, содержащего M.
Методы доступа
Объявления_методов_доступа свойства задают исполняемые операторы, связанные с чтением или записью свойства.
объявления_методов_доступа:
объявление_метода_доступа_get объявление_метода_доступа_setнеобязательно
объявление_метода_доступа_set объявление_метода_доступа_getнеобязательно
объявление_метода_доступа_get:
атрибутынеобязательно модификатор_метода_доступанеобязательно get тело_метода_доступа
объявление_метода_доступа_set:
атрибутынеобязательно модификатор_метода_доступанеобязательно set тело_метода_доступа
модификатор_метода_доступа:
protected
internal
private
protected internal
internal protected
тело_метода_доступа:
блок
;
Объявление метода доступа включает в себя объявление_метода_доступа_get, объявление_метода_доступа_set или оба этих объявления. Каждое объявление метода доступа состоит из маркера get или set, за которым следуют необязательный модификатор метода доступа и тело метода доступа.
Свойство, содержащее оба метода доступа (get и set), называется свойством для чтения и записи.
Методы доступа get и set свойства не являются отдельными членами и не могут объявляться отдельно от свойства.
Автоматически реализуемые свойства. Пример (MSDN).
Автоматически реализуемые свойства способствуют более лаконичному объявлению свойств. Пример.
namespace ConsoleApplication1
{
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return "Person: " + Name + " " + Age;
}
}
class Program
{
static void Main(string[] args)
{
Person person = new Person { Name = "John", Age = 12 };
Console.WriteLine(person);
}
}
}
В примере используется инициализатор объектов.
Инициализаторы объектов позволяют присваивать значения всем доступным полям и свойствам объекта в момент создания без явного вызова конструктора.
Person person = new Person { Name = "John", Age = 12 };
Пример
namespace ConsoleApplication1
{
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return "Person: " + Name + " " + Age;
}
}
class Persons
{
Person person = new Person { Name = "John1", Age = 121 };
string Address = "123 Main St";
public override string ToString()
{
return person.ToString()+" "+Address;
}
}
class Program
{
static void Main(string[] args)
{
Persons person = new Persons();
Console.WriteLine(person);
}
}
}
Для автоматически реализуемых свойств требуются оба метода доступа — get и set. Чтобы сделать класс неизменяемым, методы доступа set следует объявить с модификатором private. Однако в случае объявления закрытого метода доступа set для инициализации свойства нельзя использовать инициализатор объекта. Необходимо использовать конструктор или метод.
В следующем примере показано два способа реализации неизменяемого класса с автоматически реализуемыми свойствами. В первом классе для инициализации свойств используется конструктор, а во втором классе — статический метод.
class Contact
{
// Read-only properties.
public string Name { get; private set; }
public string Address { get; private set; }
// Public constructor.
public Contact(string contactName, string contactAddress)
{
Name = contactName;
Address = contactAddress;
}
}
// This class is immutable. After an object is created,
// it cannot be modified from outside the class. It uses a
// static method and private constructor to initialize its properties.
public class Contact2
{
// Read-only properties.
public string Name { get; private set; }
public string Address { get; private set; }
// Private constructor.
private Contact2(string contactName, string contactAddress)
{
Name = contactName;
Address = contactAddress;
}
// Public factory method.
public static Contact2 CreateContact(string name, string address)
{
return new Contact2(name, address);
}
}
public class Program
{
static void Main()
{
// Some simple data sources.
string[] names = {"Terry Adams","Fadi Fakhouri", "Hanying Feng",
"Cesar Garcia", "Debra Garcia"};
string[] addresses = {"123 Main St.", "345 Cypress Ave.", "678 1st Ave",
"12 108th St.", "89 E. 42nd St."};
// Create Contact objects by using a constructor.
Contact[] con = new Contact[5];
for (int i = 0; i < 5; i++)
{
con[i] = new Contact(names[i], addresses[i]);
}
foreach (Contact contact in con)
{
Console.WriteLine("{0}, {1}", contact.Name, contact.Address);
}
Console.WriteLine();
Contact2[] con2 = new Contact2[5];
// Create Contact2 objects by using a static factory method.
for (int i = 0; i < 5; i++)
{
con2[i] = Contact2.CreateContact(names[i], addresses[i]);
}
foreach (Contact2 contact in con2)
{
Console.WriteLine("{0}, {1}", contact.Name, contact.Address);
}
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
Пример использования метода вместо открытых конструкторов.
Array myArr = Array.CreateInstance(typeof(Int32), 3);
Пример использования метода вместо открытых конструкторов.
Graphics g = CreateGraphics();
g.DrawLine(new Pen(Color.AliceBlue, 3.9f), new Point(3, 7), new Point(100, 100));
Индексаторы
Индексатор является членом, дающим возможность индексировать объект так же, как массив. Индексаторы объявляются с помощью объявлений_индексаторов:
объявление_индексатора:
атрибутынеоб модификаторы_индексаторанеоб декларатор_индексатора { объявления_методов_доступа }
модификатор_индексатора:
new
public
protected
internal
private
virtual
sealed
override
abstract
extern
декларатор_индексатора:
тип this [ список_формальных_параметров ]
тип тип_интерфейса . this [ список_формальных_параметров ]
Наследование. Полиморфизм.
class A {}
class B: A {}
В этом примере класс A считается прямым базовым классом для класса B, а класс B считается производным из класса A. Так как класс A не указывает явно прямой базовый класс, его неявным прямым базовым классом является object.
За исключением класса object, каждый тип класса имеет строго один прямой базовый класс. Класс object не имеет прямого базового класса и является окончательным базовым классом для всех других классов.
Класс наследует члены своего прямого типа базового класса. Наследование означает, что класс неявно содержит все члены его прямого типа базового класса, исключая конструкторы экземпляров, деструкторы и статические конструкторы базового класса.
Пример.
using System;
namespace ConsoleApplication16
{
class BaseClass
{
public BaseClass()
{
Console.WriteLine("Вызван конструктор базового класса");
}
}
class DerivedClass : BaseClass
{
public DerivedClass()
{
Console.WriteLine("Вызван конструктор производного класса");
}
}
class Program
{
static void Main(string[] args)
{
DerivedClass md = new DerivedClass();
}
}
}
При создании экземпляра производного класса вызывается конструктор производного класса, который вызывает конструктор базового класса, выполняется код конструктора базового класса, после этого выполняется код конструктора производного класса.
Если в базовом классе определено несколько перегруженных конструкторов необходимо определить конструктор без параметров, если его нет выдается сообщение об ошибке. Для вызова конструктора с параметром необходимо использовать инициализатор конструкторов base. Пример. Использование base.
using System;
namespace ConsoleApplication16
{
public class BaseClass
{
int num;
public BaseClass()
{
Console.WriteLine("in BaseClass()");
}
public BaseClass(int i)
{
this.num = i;
Console.WriteLine("in BaseClass(int i)");
}
public int GetNum()
{
return num;
}
}
public class DerivedClass : BaseClass
{
// This constructor will call BaseClass.BaseClass()
public DerivedClass() : base()
{
}
// This constructor will call BaseClass.BaseClass(int i)
public DerivedClass(int i) : base(i)
{
}
}
class Program
{
static void Main(string[] args)
{
DerivedClass md = new DerivedClass();
DerivedClass md1 = new DerivedClass(1);
Console.WriteLine(md1.GetNum());
}
}
}
Дата: 2019-03-05, просмотров: 203.