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

时间:2019-01-23 13:22:10

标签: c# access-modifiers private-members c#-7.0

我能够从其他类的主要方法更新类实例的私有成员。为什么我被允许这样做。就像它使用“ 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();
        }
    }
}

3 个答案:

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

请看看:

ref keyword