繁体   English   中英

从同一个类的公共方法返回时,为什么我可以在其他类的公共方法中修改私有成员

[英]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修改了此行为,并将引用传递给对象,而不是值的内存地址,因此,当您修改该值时,会影响所有对其引用的类,所有值都相同

请看一下:

ref关键字

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM