Классы могут быть частичными. То есть мы можем иметь несколько файлов с определением одного и того же класса, и при компиляции все эти определения будут скомпилированы в одно.
Например, определим в проекте два файла с кодом. Не столь важно как эти файлы будут называться. Например, PersonBase.cs и PersonAdditional.cs. В одном из этих файлов (без разницы в каком именно) определим следующий класс:
public partial class Person { public void Move() { Console.WriteLine("I am moving"); } }
А в другом файле определим следующий класс:
public partial class Person { public void Eat() { Console.WriteLine("I am eating"); } }
Таким образом, два файла в проекте содержит определение одного и того же класса Person, которые содержат два разных метода. И оба определенных здесь класса являются частичными. Для этого они определяются с ключевым словом partial.
Затем мы можем использовать все методы класса Person:
class Program { static void Main(string[] args) { Person tom = new Person(); tom.Move(); tom.Eat(); Console.ReadKey(); } }
Частичные классы могут содержать частичные методы. Такие методы также опреляются с ключевым словом partial. Причем определение частичного метода без тела метода находится в одном частичном классе, а реализация этого же метода - в другом частичном классе.
Например, изменим выше определенные классы Person. Первый класс:
public partial class Person { partial void Read(); public void DoSomething() { Read(); } }
Второй класс:
public partial class Person { partial void Read() { Console.WriteLine("I am reading a book"); } }
В первом классе определен метод Read()
. Причем на момент определения первого класса неизвестно,
что представляет собой этот метод, какие действия он будет выполнять. Тем не менее мы знаем список его параметров и можем вызвать в первом классе.
Второй класс уже непосредственно определяет тело метода Read()
.
class Program { static void Main(string[] args) { Person tom = new Person(); tom.DoSomething(); } }
Стоит отметить, что по умолчанию к частичным методам применяется ряд ограничений:
Они не могут иметь модификаторы доступа
Они имеют тип void
Они не могут иметь out-параметры
Они не могут иметь модификаторы virtual, override, sealed, new
или extern
Если же они не соответствуют какому-то из этих ограничений, то для них должна быть предоставлена реализация. Как, например,
в следующем примере частичные методы применяют модификатор public
:
// первая реализация класса и его методов public partial class Person { public partial void Read(); public void DoSomething() { Read(); } } // вторая реализация класса и его методов public partial class Person { public partial void Read() { Console.WriteLine("I am reading a book"); } }