Интерфейс / IDisposable с инициализаторами объекта и свойствами

В качестве продолжения вопроса, на который дан ответ в разделе Как структурировать класс или функцию / метод (или интерфейс), чтобы в рамках использования я мог передавать значения в скобках {}?,

Как использовать инициализаторы и свойства объекта со структурой интерфейса:

public class SomeClassHelper : ISomeClassHelper 
{
}

public class SomeClass: IDisposable
{
    public SomeClass(object somevalue) {
    }

    public int AnotherValue { get; set; }

    public int AdditionalValue { get; set; }

    internal void ImHere() {
        throw new NotImplementedException();
    }

    public void Dispose() {
        throw new NotImplementedException();
    }
}

static void Main(string[] args) {
    object somevalue = null;
    using (var something = new SomeClass(somevalue) { AnotherValue = 1, AdditionalValue = 2 }) {
        something.ImHere();
    }
}

как бы я использовал вышеперечисленное, чтобы у меня был интерфейс, или цель интерфейса нарушает вышесказанное?

1 ответ

Решение

Я думаю, что вы можете неправильно понять цель интерфейса.

С https://msdn.microsoft.com/en-us/library/ms173156.aspx:

Интерфейс содержит определения для группы связанных функций, которые может реализовать класс или структура. Используя интерфейсы, вы можете, например, включить поведение из нескольких источников в класс. Эта возможность важна в C#, потому что язык не поддерживает множественное наследование классов. Кроме того, вы должны использовать интерфейс, если вы хотите имитировать наследование для структур, потому что они не могут на самом деле наследовать от другой структуры или класса.

Интерфейс должен заставить любой класс, который его реализует, удовлетворять определенным условиям, чтобы другой код мог полагаться на этот класс, имеющий определенные сходства с любым другим классом, реализующим тот же интерфейс.

Так что на ваш другой вопрос, люди ответили, сообщив, что если вы хотите использовать using блок, ваш класс должен будет реализовать IDisposable интерфейс. Это потому, что для using чтобы работать, ему нужно знать, что у класса, с которым он работает, будет метод, называемый Dispose(), что освобождает любые неуправляемые ресурсы, используемые классом.

Если твой SomeClass не имеет никаких неуправляемых ресурсов, возможно, стоит пересмотреть то, что вы пытаетесь сделать. Сборщик мусора автоматически удалит управляемые объекты (например, экземпляры вашего класса), когда они перестанут использоваться (я немного обобщу здесь).

На этот вопрос на самом деле следовало ответить, но вы, возможно, захотите изучить, как это сделать (вместо использования инициализатора), - создать конструктор для вашего класса и использовать его при создании экземпляра вашего класса.

Вы бы получили что-то вроде следующего:

    public class SomeClass: IDisposable
    {
        public SomeClass(object somevalue, int anotherValue, int additionalValue)
        {
            AnotherValue = anotherValue;
            AdditionalValue = additionalValue;
        }

        public int AnotherValue { get; set; }

        public int AdditionalValue { get; set; }

        internal void ImHere()
        {
            throw new NotImplementedException();
        }

        public void Dispose()
        {
            throw new NotImplementedException();
        }
    }

    static void Main(string[] args)
    {
        object somevalue = null;
        using (var something = new SomeClass(somevalue, 1, 2))
        {
            something.ImHere();
        }
    }

Вы можете прочитать больше об использовании конструкторов на https://msdn.microsoft.com/en-us/library/ms173115.aspx.

Другие вопросы по тегам