Могу ли я определить, был ли мне дан новый объект в качестве параметра?

Укороченная версия

Для тех, кто неу меня нет времени, чтобы прочитать мои рассуждения по этому вопросу ниже:

Есть ли способ провести политику "только новые объекты или же "только существующие объекты для метода "параметры?

Длинная версия

Есть много методов, которые принимают объекты в качестве параметров, и это нене имеет значения, есть ли у метода объект "все к себе " или нет. Например:

var people = new List();

Person bob = new Person("Bob");

people.Add(bob);
people.Add(new Person("Larry"));

ЗдесьList.Add метод занялсуществующий" Person (Боб), а также "новый» Person (Ларри), и список содержит оба элемента. Боб может быть доступен как либоbob или жеpeople[0], Ларри можно получить доступ какpeople[1] и, при желании, кэшируются и доступны какlarry (или что-то еще) после этого.

Хорошо. Но иногда метод действительноне должен будет передан новый объект. Взять, к примеру,Array.Sort, Следующее не делаетне имеет большого смысла:

Array.Sort(new int[] {5, 6, 3, 7, 2, 1});

Весь приведенный выше код - это взять новый массив, отсортировать его и затем забыть (так как счетчик ссылок достигает нуля послеArray.Sort выходы, и отсортированный массив будет собираться, если яя не ошибаюсь). ТакArray.Sort надеется "существующий" массив в качестве аргумента.

Существуют и другие методы, которые могутожидать "новый» объекты (хотя я бы вообще подумал, что иметь такое ожидание было бы ошибкой проекта). Несовершенный пример будет следующим:

DataTable firstTable = myDataSet.Tables["FirstTable"];
DataTable secondTable = myDataSet.Tables["SecondTable"];

firstTable.Rows.Add(secondTable.Rows[0]);

Как я уже сказал, это неотличный пример, так какDataRowCollection.Add Безразлично»на самом деле ожидатьновый DataRow, именно так; но этоделает ожидатьDataRow это нет уже принадлежатDataTable, Таким образом, последняя строка в коде выше выигралт работа; это должно быть:

firstTable.ImportRow(secondTable.Rows[0]);

Во всяком случае, это много настроек для моего вопроса, а именно:Есть ли способ провести политику "только новые объекты или же "только существующие объекты для метода "параметры sлибо в своем определении (возможно, с помощью некоторых пользовательских атрибутов I 'Я не знаю) или в самом методе (возможно, с помощью размышлений, хотя явероятно, уклоняться от этого, даже если бы он был доступен)?

В противном случае любые интересные идеи относительно того, как возможно достигнуть этого, были бы более чем приветствоваться. Например, я полагаю, если бы был какой-то способ получить GCs подсчет ссылок для данного объекта, вы можете сразу сказать в начале метода,Вы получили новый объект или нет (если выРазумеется, мы имеем дело с ссылочными типами - это единственный сценарий, к которому этот вопрос относится в любом случае).

РЕДАКТИРОВАТЬ:

Более длинная версия становится длиннее.

Хорошо, предположим, у меня есть метод, который я хочу принятьTextWriter выводить его прогресс или что-у-тебя:

static void TryDoSomething(TextWriter output) {
    // do something...
    if (output != null)
        output.WriteLine("Did something...");

    // do something else...
    if (output != null)
        output.WriteLine("Did something else...");

    // etc. etc.

    if (output != null)
        // do I call output.Close() or not?
}

static void TryDoSomething() {
    TryDoSomething(null);
}

Теперь давайтеРассмотрим два разных способа, которыми я мог бы назвать этот метод:

string path = GetFilePath();
using (StreamWriter writer = new StreamWriter(path)) {
    TryDoSomething(writer);

    // do more things with writer
}

ИЛИ ЖЕ:

TryDoSomething(new StreamWriter(path));

Хм ... кажется, что это создает проблему, не так лине так ли? Я'мы построилиStreamWriter, который реализуетIDisposable, ноTryDoSomething ISN»не собираюсь знать, имеет ли он эксклюзивный доступ кoutput аргумент или нет. Таким образом, объект либо удаляется преждевременно (в первом случае), либо неизбавиться от всех (во втором случае).

Я не говорю, что это будет отличный дизайн, обязательно. Возможно, Джош Стодола прав, и это просто плохая идея с самого начала. Во всяком случае, я задал вопрос в основном потому, что мне было просто любопытно,возможный, Похоже, ответ: не совсем.

Ответы на вопрос(9)

Ваш ответ на вопрос