Указатель на переменную, принадлежащую другому классу в C # - PullRequest
0 голосов
/ 10 июля 2019

В приведенном ниже коде я надеюсь, что в итоге для обоих классов ClassA и Main будет указано, что имя Main - «GoodBye». Однако в конце classA по-прежнему сохраняет имя Main - «Hello», в то время как Main знает, что его имя имеетбыл изменен на «GoodBye».Как разрешить классу A видеть, что имя Main было изменено на GoodBye?

Разве это не разрешено в C # и считается небезопасным, и поэтому вы должны заключить код в блоки «unsafe»?

После тестирования я понимаю, что использование ссылки позволяет classA изменять имя Main, но не позволяет classA видеть, когда имя Main было изменено.

class Program
{
    static void Main(string[] args)
    {
        string MyName = "Hello";

        Console.WriteLine($"Main thinks Main's name is: {MyName}");
        Console.WriteLine($"");

        Console.WriteLine($"Creating ClassA");
        ClassA classA = new ClassA(ref MyName);

        Console.WriteLine($"Main thinks Main's name is: {MyName}");
        classA.WriteOutMainName();

        MyName = "GoodBye";
        Console.WriteLine($"");
        Console.WriteLine($"Main changed it's name to: {MyName}");
        Console.WriteLine($"");

        Console.WriteLine($"Main thinks Main's name is: {MyName}");
        classA.WriteOutMainName();

    }
}

public class ClassA
{
    string MainName;
    public ClassA(ref string mainName)
    {
        MainName = mainName;
        mainName = "Dog";
    }

    public void WriteOutMainName()
    {
        Console.WriteLine($"ClassA thinks Main's name is: {MainName}");
    }
}

Вывод для вышеследующее:

Main thinks Main's name is: hello

Creating ClassA
Main thinks Main's name is: hello
ClassA thinks Main's name is: hello

Main changed it's name to: GoodBye

Main thinks Main's name is: GoodBye
ClassA thinks Main's name is: hello
Press any key to continue . . .

1 Ответ

0 голосов
/ 10 июля 2019

Обновление после проверки заявления Эми выше:

Ниже работает как нужно:

class Program
{
    static void Main(string[] args)
    {
        //string MyName = "Hello";

        NameHolder MyName = new NameHolder();
        MyName.Name = "hello";

        Console.WriteLine($"Main thinks Main's name is: {MyName.Name}");
        Console.WriteLine($"");

        Console.WriteLine($"Creating ClassA");
        ClassA classA = new ClassA(MyName);

        Console.WriteLine($"Main thinks Main's name is: {MyName.Name}");
        classA.WriteOutMainName();

        MyName.Name = "GoodBye";
        Console.WriteLine($"");
        Console.WriteLine($"Main changed it's name to: {MyName.Name}");
        Console.WriteLine($"");

        Console.WriteLine($"Main thinks Main's name is: {MyName.Name}");
        classA.WriteOutMainName();

    }
}

public class ClassA
{
    NameHolder MainName;
    public ClassA(NameHolder mainName)
    {
        MainName = mainName;
    }

    public void WriteOutMainName()
    {
        Console.WriteLine($"ClassA thinks Main's name is: {MainName.Name}");
    }
}

public class NameHolder
{
    private string name = "";
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
}

Вывод следующий:

Main thinks Main's name is: hello

Creating ClassA

Main thinks Main's name is: hello
ClassA thinks Main's name is: hello

Main changed it's name to: GoodBye

Main thinks Main's name is: GoodBye
ClassA thinks Main's name is: GoodBye
Press any key to continue . . .

РЕДАКТИРОВАТЬ 3: Вы можете упростить свой класс NameHolder, если вы не делаете ничего особенного / дополнительного в блоках get и set:

public class NameHolder
{
    public string Name {get; set;}
}
...