c# – 如果.Create()无法实例化,它应该返回空对象,null还是抛出异常?

我希望能够使用这种代码实例化我的应用程序中的任何对象:

SmartForm smartForm = SmartForm.Create("id = 23");
Customer customer = Customer.Create("id = 222");

我现在正在讨论如果该对象不存在,Create()应该返回什么.

>如果Create()返回一个空对象,那么这就是一种“空模式”,我仍然可以在我的应用程序周围传递该对象并在其上调用方法,这使得使用此模型进行编程变得方便和容易
>如果Create()返回null,那么我需要在每次实例化后检查对象是否等于null,这使得编程更乏味但更明确.这样做的一个问题是,如果你忘记检查null,你的应用程序可能会工作很长时间而你不知道你没有检查null,然后突然中断
>如果Create()抛出异常,它基本上与返回null相同,但是通过让你为每个实例创建一个try,next,finally块,使编程更加繁琐,但你可以抛出各种类型的异常(你可以使用null解决方案,这可能会冒泡,以便您可以更明确地处理UI上的深层错误,所以我认为这是最强大的解决方案,尽管会产生try / catch代码膨胀

所以它似乎是一种轻盈/稳健的权衡.有没有人有任何经验可以根据这个决定沿着这些方向做出决定?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestFactory234.Models
{
    public class SmartForm : Item
    {
        public string IdCode { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public int LabelWidth { get; set; }

        public SmartForm() { }

        private SmartForm(string loadCode)
        {
            _loadCode = loadCode;
            TryToInstantiateFromDatabase();
        }

        public static SmartForm Create(string loadCode)
        {
            SmartForm smartForm = new SmartForm(loadCode);

            if (!smartForm.IsEmpty())
            {
                return smartForm;
            }
            else
            {
                return null;
            }
        }
    }
}
最佳答案
这取决于 – 如果它失败,因为某些东西肯定是错误的,那么异常会使编程变得更容易 – 你不会在每次调用时编写try / catch,只是让异常冒泡.将其与检查null /空白返回值进行比较,然后抛出异常.

这听起来像是使用ArgumentException,IMO的正确时间.

如果你发现自己创建了try / catch“膨胀”,那么看看为什么你真的需要捕获异常而不是让它们冒出来.

转载注明原文:c# – 如果.Create()无法实例化,它应该返回空对象,null还是抛出异常? - 代码日志