Я немного запутался в том, как ValueType
объекты управляются памятью в .NET. Я понимаю, что типы значений помещаются в стек для каждого экземпляра / объявления. Я не совсем уверен в том, что представляет собой новый экземпляр / объявление. Думаю, мой главный вопрос:
Если я передаю параметр ValueType
методу, но не присваиваю ему значение, создается ли в стеке новый экземпляр?
Я не уверен, правильно ли я это формулирую, поэтому я написал простой пример программы, чтобы облегчить понимание моей путаницы.
void Main()
{
//-------------------------| Line 1:
int MichaelJordan = 23;
//-------------------------| Line 2:
int HoursInADay = 24;
//-------------------------| Line 3:
Console.WriteLine("Michael Jordan is "+(NumberHelper.Is23(MichaelJordan) ? string.Empty : "not ")+"23");
//-------------------------| Line 4:
Console.WriteLine("The last number that wasn't 23 was "+NumberHelper.LastNumberThatWasnt23);
//-------------------------| Line 5:
Console.WriteLine("Hours in a Day is "+(NumberHelper.Is23(HoursInADay) ? string.Empty : "not ")+"23");
//-------------------------| Line 6:
Console.WriteLine("The last number that wasn't 23 was "+NumberHelper.LastNumberThatWasnt23);
}
public static class NumberHelper {
public static int LastNumberThatWasnt23;
public static bool Is23(int candidate){
if(candidate != 23){
LastNumberThatWasnt23 = candidate;
return false;
}
return true;
}
}
Итак, вот мои вопросы по программе.
Сколько целочисленных экземпляров создается в стеке в этой программе?
Где именно в коде создается каждый экземпляр типа значения в стеке?
Хотя есть большая вероятность, что я ошибаюсь, это то, что я думаю, происходит, и в чем я не уверен.
Строка 1: я знаю, что в стеке создан новый экземпляр для переменной
MichaelJordan
Строка 2: я знаю, что в стеке создан новый экземпляр для переменной
HoursInADay
Строка 3: Создается ли копия экземпляра значения из переменной
MichaelJordan
, чтобы быть параметром метода? Создан ли экземпляр значения23
для сравнения?Строка 4: значение поля
LastNumberThatWasnt23
не инициализировано, поэтому возвращается значение по умолчанию. Создан ли для этого поля новый экземпляр со значением по умолчанию?Строка 5: те же вопросы, что и Строка 3, но я также знаю, что в стеке создается новый экземпляр для поля
LastNumberThatWasnt23
, потому что я его устанавливаю.Строка 6: Теперь в поле есть значение. Но, ссылаясь на это значение и передавая его в метод
Console.WriteLine
, создаю ли я новый экземпляр значения в стеке?
У меня есть еще одна часть этого вопроса: Как мне узнать о подобных вещах? Могу ли я сделать это программно? Есть ли какие-нибудь инструменты, которые можно использовать для раскрытия такой информации?
Я знаю, что это длинный вопрос, поэтому благодарю вас за то, что вы нашли время его прочитать.