Передача параметров С# посредством путаницы
После прочтения некоторых статей все еще путают. Почему изменение значения 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";
}
}
DateTime не является ссылочным типом, это структура, которая означает тип значения.
DateTime
- это тип значения (struct), который нельзя изменить. Это не ссылочный тип.
Когда вы вызываете метод, который, как представляется, меняет структуру, он часто действительно возвращает новую структуру, не изменяя оригинал, потому что оригинал не может быть изменен (он неизменен). Хотя то же самое относится к строкам, строки не являются типами значений; они являются ссылочными типами, которые были запроектированы как неизменные, отсюда необходимость в таких классах, как StringBuilder
.
Кроме того, передача ссылочных типов в качестве параметров не совпадает с передачей параметров по ссылке с использованием ref
или out
.
Как отмечали другие, разница в классе (который StringBuilder есть) и Struct (который DateTime). Вот несколько статей, которые помогут вам:
http://msdn.microsoft.com/en-us/library/ms173109.aspx
а также
http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx
Хорошее понимание структур по сравнению с классами важно в ООП, и особенно в С#