Передача параметров С# посредством путаницы

91
9

После прочтения некоторых статей все еще путают. Почему изменение значения StringBuilder изменилось бы, а значение DateTime - нет? Оба являются ссылочными типами, как я понимаю:

class Program
{
static void Main(string[] args)
{
DateTime myDt = DateTime.MinValue;
Change(myDt);
Console.WriteLine(myDt);

StringBuilder y = new StringBuilder();
y.Append("hello");
Foo(y);
Console.WriteLine(y);

String test = "hello";
Foo(test);

}

public static void Change(DateTime dt)
{
dt.AddDays(24);
//or dt=dt.AddDays(24);
}

static void Foo(StringBuilder x)
{
x.Append(" world");
}

static void Foo(String x)
{
x = x + " world";
}
}

спросил(а) 2012-05-11T22:52:00+04:00 7 лет, 7 месяцев назад
5
Решение
62

DateTime - это структура, поэтому это тип значения.

Так, как и любой другой тип значения, он прошел мимо значения (скопирован на практике) и только после ввода в стек функций.

ответил(а) 2012-05-11T22:55:00+04:00 7 лет, 7 месяцев назад
Еще 4 ответа
108

DateTime не является ссылочным типом, это структура, которая означает тип значения.

ответил(а) 2012-05-11T22:54:00+04:00 7 лет, 7 месяцев назад
80

DateTime - это тип значения (struct), который нельзя изменить. Это не ссылочный тип.

Когда вы вызываете метод, который, как представляется, меняет структуру, он часто действительно возвращает новую структуру, не изменяя оригинал, потому что оригинал не может быть изменен (он неизменен). Хотя то же самое относится к строкам, строки не являются типами значений; они являются ссылочными типами, которые были запроектированы как неизменные, отсюда необходимость в таких классах, как StringBuilder.

Кроме того, передача ссылочных типов в качестве параметров не совпадает с передачей параметров по ссылке с использованием ref или out.

ответил(а) 2012-05-11T22:54:00+04:00 7 лет, 7 месяцев назад
46

DateTime - это структура - следовательно, тип значения. Строки являются неизменяемыми ссылочными типами.

ответил(а) 2012-05-11T22:56:00+04:00 7 лет, 7 месяцев назад
33

Как отмечали другие, разница в классе (который StringBuilder есть) и Struct (который DateTime). Вот несколько статей, которые помогут вам:

http://msdn.microsoft.com/en-us/library/ms173109.aspx

а также

http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx

Хорошее понимание структур по сравнению с классами важно в ООП, и особенно в С#

ответил(а) 2012-05-11T22:58:00+04:00 7 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема