c#调用方法后打印


public class A
{
public int A1 { get; set; }
public int A2 { get; set; }
}
static void Main(string[] args)
{

int i = 0;
Method1(i);
Console.WriteLine($"i={i}");
var str = "This is a string";
Method2(str);
Console.WriteLine(str);
var a = new A()
{
A1 = 5,
A2 = 6
};
Method3(a);
Console.WriteLine($"a.A1={a.A1}, a.A2={a.A2}");
Method4(a);
Console.WriteLine($"a.A1={a.A1}, a.A2={a.A2}");
Method5(ref a);
Console.WriteLine($"a.A1={a.A1}, a.A2={a.A2}");


}
private static void Method5(ref A a)
{
a = new A()
{
A1 = 10,
A2 = 11
};
}
private static void Method4(A a)
{
a = new A()
{
A1 = 10,
A2 = 11
};

}
private static void Method3(A a)
{
a.A1 = 6;
}
private static void Method2(string str)
{
str = "This is a new string";
}
private static void Method1(int i)
{
i = 5;
}

我期望的输出和实际输出

我认为输出将是:我= 0

这是一个字符串a.A1 = 5, a.A2 = 6a.A1 = 5, a.A2 = 6a.A1 = 10, a.A2 = 11但是输出是:我= 0这是一个字符串a.A1 = 6, a.A2 = 6a.A1 = 6, a.A2 = 6a.A1 = 10, a.A2 = 11

我很高兴得到方法3和方法4是如何工作的解释。非常感谢!

让我们看一下Method3(a)

private static void Method3(A a)
{
a.A1 = 6;
}

之前的值是5,对吗?现在它被声明为6,官方值现在是6。你正在引用变量A1并给它一个新值!

Console.WriteLine($"a.A1={a.A1}, a.A2={a.A2}");

基本上你用旧值(5)覆盖了新值(6),因为你使用了一个引用类型

所以当我们进入Method4(a)A1 = 6, A2 = 6. 方法4A1 = 10 and A2 = 11是因为你没有提到任何东西。没有引用类型。它不知道你在引用对象a仅仅因为您传递了变量名作为参数

你基本上已经初始化了一个a类的新对象在Method4没有引用。当没有引用时,它不知道将方法(4)中的值存储在哪里这就是为什么这些值没有改变。

如果你看Method5(a),则使用">ref";关键字,这意味着ref关键字表明值是通过引用传递的。ref指向最初初始化的对象。

我知道这可能会让人感到困惑,但我强烈建议使用debug,然后一步一步地进行调试。花点时间,记下发生变化的地方,这样你就能更好地理解。

阅读这些文章:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/ref#passing-an-argument-by-referencehttps://www.codecademy.com/learn/learn-c-sharp/modules/learn-csharp-references

如果你觉得我的帖子有帮助,请给它投票。

快乐编码:-)

最新更新