У меня есть объект Contact, который хранится на диске:

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;
2
julian bechtold 18 Янв 2022 в 12:54

3 ответа

Лучший ответ

Вызов new Contact всегда приводит к созданию объекта Contact или возникновению исключения. Невозможно заставить конструктор «вернуть» null.

Однако вы можете перенести эту логику в другой класс и использовать шаблон проектирования Factory:

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;}
    /* ... */
}
2
Mureinik 18 Янв 2022 в 13:12

Рассматривали ли вы определение типа как типа, допускающего значение NULL? например

Contact? nullContact2 = null;

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

0
majixin 18 Янв 2022 в 13:27

Contact nullContact = default(Contact);

0
klekmek 18 Янв 2022 в 18:48