接口/ IDisisable与对象初始化器和属性

时间:2016-02-01 20:34:43

标签: c# object-initializers

作为How do I structure a class or a function/method (or interface) so that as part of a using, I can pass values in the {} brackets?

处回答的问题的后续跟进

如何利用具有接口结构的对象初始化器和属性:

0.8.0-edge

我如何使用上面的内容以便我可以拥有界面,或者界面的目的是否会破坏上述内容?

1 个答案:

答案 0 :(得分: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处了解有关使用构造函数的更多信息。