C# 通过引用混淆传递参数
本文关键字:参数 引用 | 更新日期: 2023-09-27 18:33:59
看了一些文章后仍然感到困惑。为什么更改 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
是无法修改的值类型(结构)。它不是引用类型。
当您调用似乎更改结构的方法时,它通常实际上返回一个全新的结构,而不修改原始结构,因为原始结构无法修改(它是不可变的)。尽管这同样适用于字符串,但字符串不是值类型;它们是被设计为不可变的引用类型,因此需要诸如 StringBuilder
之类的类。
此外,将引用类型作为参数传递与使用 ref
或 out
通过引用传递参数不同。
DateTime 是一个结构,所以它是一个值类型。
因此,像任何其他值类型一样,它按值(在实践中复制)并且仅在注入到函数堆栈之后才过去。
DateTime 是一个结构体 - 因此是一个值类型。字符串是不可变的引用类型。
正如其他人提到的,区别在于类(StringBuilder是)和结构(DateTime是)。以下是一些文章,可进一步提供帮助:
http://msdn.microsoft.com/en-us/library/ms173109.aspx
和
http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx
在 OOP 中,对结构与类的良好理解很重要,尤其是 c#