Я немного озадачен тем, как 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
, я создаю новый экземпляр значения в стеке?
У меня есть еще одна часть к этому вопросу, а именно Как бы я узнал такие вещи? Могу ли я сделать это программно? Есть ли какие-либо инструменты, которые можно использовать для раскрытия такой информации?
Я знаю, что это длинный вопрос, поэтому я благодарю вас за то, что вы нашли время прочитать его.