[英]why am i able to modify private members in a public method of other class, when returned from a public method of same class
我能够从其他类的main方法更新类实例的私有成员。 为什么我被允许这样做。 就像它使用“ 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();
}
}
}
当您返回引用时,这意味着“调用者可以为我返回的变量创建别名”。
如果该变量是私有变量,则无关紧要。 调用者可以为该变量创建别名。 如果您不希望呼叫者这样做,则不应该赋予他们这种能力!
记住,隐私只与名字有关 。 a
是私有的,因此名称a
只能在该类中使用 。 那就是所有私人手段。 这并不意味着该变量不能更改。 这意味着该变量不能在类之外用该名称标识。
在您的示例中,您没有在class中标识要通过其名称修改的变量。 您通过别名来标识它,别名是局部变量a
。
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/ref-returns
AM()
返回一个参考Aa
和您分配参考变量a
,这是不值Aa
,但与参考Aa
。
所以,赋值a
是值分配给Aa
。
C#具有按引用类型和按值类型
类型值是原始的技巧,例如int,float,double,当您将其传递给方法时,您实际上会传递值,就像传递对象的副本一样。 关键字ref修改了此行为,并将引用传递给对象,而不是值的内存地址,因此,当您修改该值时,会影响所有对其引用的类,所有值都相同
请看一下:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.