【问题标题】:Point to a variable owned by a different class in C#指向 C# 中不同类拥有的变量
【发布时间】:2019-11-20 04:33:58
【问题描述】:

在下面的代码中,我希望将 classA 和 Main 都归结为 Main 的名字是“GoodBye” 但是,最后,classA 仍然是 Main 的名字是 'Hello' 而 Main 知道它的名字有已更改为“再见”。如何让 classA 看到 Main 的名称已更改为 GoodBye?

这在 C# 中是不允许的并且被认为是不安全的,因此您必须将代码包装在“不安全”块中吗?

经过测试,我了解到使用引用允许 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 . . .

【问题讨论】:

  • 创建一个类,给它一个Name 属性,然后将该类的一个实例传递给您的ClassA。瞧,ClassA 现在有了对名称所有者的引用,并且可以随时获取它的名称。
  • 嗨,艾米,效果很好。如果您重申您的评论作为答案,我可以将其标记为解决方案。谢谢。
  • 欢迎回答。您已经在问题中这样做了,只需将其移至答案中即可。

标签: c# pointers ref


【解决方案1】:

测试艾米上述陈述后更新:

以下内容按需要工作:

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: 如果您没有在 get 和 set 块中做任何特殊/额外的事情,您可以简化 NameHolder 类:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多