指向 C# 中不同 class 拥有的变量
Point to a variable owned by a different class in C#
在下面的代码中,我希望以 classA 和 Main 结束,因为 Main 的名字是 "GoodBye" 但是,最后,classA 仍然是 Main 的名字是 'Hello'而 Main 知道它的名称已更改为 'GoodBye'。如何让 classA 看到 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 . . .
测试艾米上述说法后更新:
下面的工作符合需要:
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 class 如果你没有在 get 和 set 块中做任何事情 special/extra:
public class NameHolder
{
public string Name {get; set;}
}
在下面的代码中,我希望以 classA 和 Main 结束,因为 Main 的名字是 "GoodBye" 但是,最后,classA 仍然是 Main 的名字是 'Hello'而 Main 知道它的名称已更改为 'GoodBye'。如何让 classA 看到 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 . . .
测试艾米上述说法后更新:
下面的工作符合需要:
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 class 如果你没有在 get 和 set 块中做任何事情 special/extra:
public class NameHolder
{
public string Name {get; set;}
}