Могу ли я определить, был ли мне дан новый объект в качестве параметра?
Для тех, кто неу меня нет времени, чтобы прочитать мои рассуждения по этому вопросу ниже:
Есть ли способ провести политику "только новые объекты или же "только существующие объекты для метода "параметры?
Длинная версияЕсть много методов, которые принимают объекты в качестве параметров, и это нене имеет значения, есть ли у метода объект "все к себе " или нет. Например:
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
аргумент или нет. Таким образом, объект либо удаляется преждевременно (в первом случае), либо неизбавиться от всех (во втором случае).
Я не говорю, что это будет отличный дизайн, обязательно. Возможно, Джош Стодола прав, и это просто плохая идея с самого начала. Во всяком случае, я задал вопрос в основном потому, что мне было просто любопытно,возможный, Похоже, ответ: не совсем.