我有一个Login.cs
类,并且在其中设置了以下属性。
private string Username_;
private string Password_;
public string UserName
{
get => Username_;
set => Username_ = value;
}
public string Password
{
get => Password_;
set => Password_ = value;
}
并在以下两个属性的同一类中设置值。
UserName = "admin";
Password = "admin";
Username_
和Password_
都是string
的地方。现在,我在Usercontrol
上单击按钮时正在访问另一个MainWindow
,如下所示。
<vm:ViewUsers x:Name="ViewAllUsers" Visibility="Hidden"/>
我在UserControl后面的代码中所做的如下操作,如下所示通过Username
访问Password
和Property Getter Setter
的值。
string username = Login.GetInstance().UserName;
string password = Login.GetInstance().Password;
在调试时obj.UserName;
属性返回Null。为什么它返回null,我该如何解决?
答案 0 :(得分:3)
问题是您在获取属性之前正在创建null
的新实例:
Login()
现在它已更改为// Code originally in the question
Login obj = new Login();
,但我们不知道该方法的作用。如果 that 方法每次都返回对Login.GetInstance()
新实例的引用,那么我们将面临同样的问题。
该对象中的两个属性都将为null,因为您尚未将它们设置为任何值。 (所有引用类型的默认值为null。)对我来说,不清楚将属性设置为其他任何值的位置,但是将其设置为哪个对象与随后使用的对象都不相同在最后的代码中,您向我们展示了。
您需要确保可以在调用“ setters”的对象上使用“ getters”。
顺便说一句,由于您的属性很简单(它们只是获取和设置变量,而没有其他行为,例如验证),因此您可以替换第一段代码的 all 具有自动实现的属性:
Login
答案 1 :(得分:2)
您误会了我认为吸气剂和塞脂剂的工作原理。
在初始化对象时,所有未初始化的字段均设置为默认值(引用类型为{null
,数字为0等)。
字母和二传手,正如其名字所暗示的那样,是用来设定价值和获取价值的。
您正在做什么,初始化后,您将使用私有字段为相应的设置器提供值。但是它的作用是将提供给它的值分配给底层字段。
由于您使用的是同一个私有字段,因此您永远不会初始化它,因为它是null
(正如我提到的),因此您尝试通过setter设置它的值,但是在其中传递的内容是{{1 }},因此您也会以null
s结尾。
C#提供了一些称为属性的属性,因此您不需要私有字段。除非您要为getter和setter开发一些其他逻辑。
答案 2 :(得分:0)
正如其他用户所说,您正在创建一个Login的新实例,该实例自动将字段初始化为默认值(对于引用类型,为null,对于数字为0)。
此外,您可以查看删除Login类的默认构造函数,并将其作为构造函数:
public Login(string username, string password)
{
Username = username;
Password = password;
}
这样做,您就可以执行Login login = new Login("admin", "admin")
。
如果您只希望拥有一个Login类实例,也可以查看 Singleton 模式。