почему я могу изменять закрытые члены в публичном методе другого класса, если он возвращен из публичного метода того же класса - PullRequest
0 голосов
/ 23 января 2019

Я могу обновить закрытые члены экземпляра класса из метода 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();
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 24 января 2019

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/ref-returns

A.M() возвращает ссылку для A.a, и вы присваиваете эту ссылку переменной a, которая является не значением A.a, а ссылкой на A.a.

Итак, присвоение значения a означает присвоение значения A.a.

0 голосов
/ 24 января 2019

Когда вы возвращаете ссылку, это означает, что «вызывающая сторона получает псевдоним для переменной, которую я вернула».

Если эта переменная является закрытой, это не имеет значения.Вызывающий объект создает псевдоним для этой переменной;если вы не хотите, чтобы звонящий делал это, вам не следовало бы давать им такую ​​возможность!

Помните, что конфиденциальность - это только для имен .a является личным, поэтому имя a может использоваться только из этого класса .Это все, что частные средства.Это не означает, что переменная не может быть изменена;это означает, что переменная не может быть идентифицирована этим именем за пределами класса.

В вашем примере вы не идентифицируете изменяемую переменную по ее имени в классе .Вы определяете его по псевдониму, который является локальной переменной a.

0 голосов
/ 23 января 2019

C # имеет типы по ссылкам и типы по значению

Значения типов являются примитивными типами, такими как int, float, double, и когда вы передаете его методу, вы действительно передаете значение, так что это как передача копиипредмет.Ключевое слово ref изменяет это поведение и передает ссылку на объект, адрес памяти значения, а не значения, поэтому, когда вы изменяете значение, оно влияет на все классы, на которые есть ссылка, значение одинаково во всех

Пожалуйста, посмотрите:

ключевое слово ref

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...