我可以用 null 初始化一个对象吗?

Can I initialize an object with null?

我有一个对象 Contact,存储在磁盘上。
使用 Contact contact = new Contact("1234") 创建联系人对象后,它会自动从磁盘加载:

class Contact
{
    public Contact(string id)
    {
        Node? testNode = NodeInterface.FileManager.LoadNode(id);
        if (testNode != null)
        {
            LoadContact((Node) testNode);
        }
        else
        {
            throw new Exception("Contact does not exist on Disk!"); 
        }
    }
    public string Name {get; set;}
    public string Address {get; set;}
    /* ... */
}

现在我可以通过以下方式初始化联系人:

Contact contact1 = new Contact("1234");
Contact nullContact1;
Contact nullContact2 = null;

是否可以用某些东西替换构造函数中抛出异常的行,以便结果为空?

Contact nullContact1 = new Contact("thisIdDoesNotExist");
Contact nullContact2 = null;

调用new Contact 将始终导致创建Contact 对象或抛出异常。无法使构造函数“return”null.

但是,您可以将此逻辑移动到另一个 class 并使用工厂设计模式:

public class ContactFactory
{
    public static CreateContact(string id)
        Node? testNode = NodeInterface.FileManager.LoadNode(id);
        if (testNode != null)
        {
            return new Contact(testNode)
        }
        else
        {
            return null;
        }
}

class Contact
{
    public Contact(Node idNode)
    {
        LoadContact(idNode);
    }
    public string Name {get; set;}
    public string Address {get; set;}
    /* ... */
}

您是否考虑过将该类型定义为可空类型?例如

Contact? nullContact2 = null;

https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references