我能够从其他类的主要方法更新类实例的私有成员。为什么我被允许这样做。就像它使用“ ref”关键字一样吗?
我尝试使用“ ref”关键字进行修改。
using System;
namespace Test2
{
class A
{
private int a=10;
public ref int M()
{
return ref a;
}
virtual public void display()
{
Console.WriteLine("class A");
}
}
class B:A
{
}
class Program
{
static void Main(string[] args)
{
B b = new B();
ref int a = ref b.M();
Console.WriteLine(a);
a = 20;
Console.WriteLine(b.M());
Console.ReadKey();
}
}
}
答案 0 :(得分:9)
当您返回引用时,这意味着“调用者可以为我返回的变量创建别名。”
如果该变量是私有变量,则无关紧要。调用者可以为该变量创建别名。如果您不希望呼叫者这样做,那么您不应该赋予他们这种能力!
请记住,隐私仅关于姓名。 a
是私有的,因此名称a
只能在该类中使用。那就是所有私人手段。这并不意味着该变量不能更改。这意味着该变量不能在类之外用该名称标识。
在您的示例中,您没有在类中识别正在被其名称修改的变量。您通过别名来标识它,别名是 local 变量a
。
答案 1 :(得分:1)
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/ref-returns
A.M()
返回对A.a
的引用,然后将该引用分配给变量a
,该变量不是A.a
的值,而是对{{1}的引用}。
因此,为A.a
分配值就是为a
分配值。
答案 2 :(得分:-3)
C#具有按引用的类型和按值的类型
类型值是原始的技巧,例如int,float,double,当您将其传递给方法时,您实际上会传递值,就像传递对象的副本一样。 关键字ref修改了此行为,并将引用传递给对象,而不是值的内存地址,因此,修改值会影响所有对其引用的类,所有值都相同
请看看: