在C#中干掉对象实例化

时间:2008-10-25 23:55:03

标签: c# .net

此代码:

public class WidgetPlatform
{
    public Widget LeftmostWidget { get; set; }
    public Widget RightmostWidget { get; set; }

    public String GetWidgetNames()
    {
        return LeftmostWidget.Name + " " + RightmostWidget.Name;
    }
}

不包含任何值得担心的重复,但它并不是特别强大。由于Widgets未经过空值检查,我们将留下一个漏洞的开头。我们可以进行空检查,但这感觉就像工作一样。这就是我真正想要的:

public class WidgetPlatform
{
    [Required]
    public Widget LeftmostWidget { get; set; }

    [Required]
    public Widget RightmostWidget { get; set; }

    public String GetWidgetNames()
    {
        return LeftmostWidget.Name + " " + RightmostWidget.Name;
    }
}

理想情况下,如果在没有设置Widgets的情况下实例化对象,则会导致编译错误(最好的错误),但这看起来很高。有没有办法使这种语法至少在实例化时抛出错误?如果所有经过null检查的对象都从相同的类型继承,但没有多次继承会很快变得丑陋,那么有一种(相对)明显的方法可以用反射来做。

3 个答案:

答案 0 :(得分:5)

构造函数出了什么问题?

public class WidgetPlatform
{
    public Widget LeftmostWidget { get; set; }
    public Widget RightmostWidget { get; set; }

    public WidgetPlatform()
    {
        this.LeftMostWidget = new Widget();
        this.RightMostWidget = new Widget();
    }

    public WidgetPlatform(Widget left, Widget right)
    {
        if(left == null || right == null)
            throw new ArgumentNullException("Eeep!");

        this.LeftMostWidget = left;
        this.RightMostWidget = right;
    }


    public String GetWidgetNames()
    {
        return LeftmostWidget.Name + " " + RightmostWidget.Name;
    }
}

答案 1 :(得分:3)

public class WidgetPlatform
{
     public Widget LeftWidget
     {
         get;
         private set;
     }

     public Widget RightWidget
     {
         get;
         private set;
     }

     WidgetPlatForm(Widget w1, Widget w2)
     {
         if (w1 == null || w2 == null)
             throw new ArgumentException();

         this.LeftWidget = w1;
         this.RightWidget = w2;          
     }

     // Etc
}

答案 2 :(得分:0)

有一种思想流派认为最好封装你的构造函数,而且似乎在这里是合适的。参考:

http://www.amazon.com/Emergent-Design-Evolutionary-Professional-Development/dp/0321509366

您可以考虑:

public class WidgetPlatform
    {
        /// <summary>
        /// Hide the constructor.
        /// </summary>
        private WidgetPlatform(Widget left, Widget right)
        {
            this.LeftmostWidget = left;
            this.RightmostWidget = right;
        }

        public Widget LeftmostWidget
        {
            get;
            private set;
        }

        public Widget RightmostWidget
        {
            get;
            private set;
        }

        public static WidgetPlatform GetInstance(Widget left, Widget right)
        {
            return new WidgetPlatform(left, right);
        }
    }

在GetInstance中,你可以检查null,并决定该怎么做,或者不......你现在有很多选择。

希望有帮助...