Является ссылочным типом
- Интерфейс может [[Множественное наследование в интерфейсе (interface)|наследоваться от нескольких интерфейсов]]
- Интерфейсы не могут содержать поля данных. Интерфейсы могут содержать только объявления методов, свойств, событий и индексаторов.
- Когда класс имплементирует интерфейс, то интерфейс становится со-родителем.
- Интерфейсы в C# могут определять только публичные (public) члены, которые должны быть реализованы открыто (public) в классах, которые реализуют интерфейс.
- Интерфейсы не могут содержать конструкторы: Поскольку интерфейсы предназначены для определения контракта, а не для создания экземпляров, они не могут содержать конструкторы.
- В интерфейсах можно реализовывать методы и свойства. Называется "[[Интерфейсы с реализацией по умолчанию (Default Interface Implementations)]]
- Статические члены в интерфейсах: Интерфейсы могут содержать статические члены. Это расширяет возможности интерфейсов, позволяя им предоставлять реализацию по умолчанию не только для экземплярных методов.
Если структура реализовала любой интерфейс, то при
IExampleInterface example = new ExampleStruct();
происходит упаковка структуры в объект, который затем хранится в куче. Это необходимо, потому что все интерфейсы в C# считаются ссылочными типами, даже если они реализуются структурами. Упаковка в этом случае представляет собой процесс преобразования значимого типа (структура) в ссылочный тип (объект).
### Статические классы поддерживают интерфейсы?
Нет, статические классы в C# не могут реализовать интерфейсы. Статический класс в C# предназначен для предоставления вспомогательных функций и утилит, которые не требуют сохранения состояния или доступа к данным конкретного экземпляра.
Интерфейсы, с другой стороны, предназначены для определения контракта поведения, который должны следовать другие классы. Этот контракт обычно реализуется экземплярами класса, что противоречит идее статического класса.
Таким образом, статические классы не поддерживают интерфейсы.
### Статические методы можно определить в интерфейсе?
Определить статический метод в интерфейсе можно, но он не будет доступен для имплементации классами, которые реализуют интерфейс.
То есть можно использовать только так:
```csharp
public interface IMyInterface
{
void InstanceMethod();
static void StaticMethod()
{
// Реализация статического метода
}
}
public class MyClass : IMyInterface
{
public void InstanceMethod()
{
// Реализация метода экземпляра
}
}
// Теперь можно вызвать статический метод следующим образом:
IMyInterface.StaticMethod();
```