我有一个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
s。现在我有另一个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,我该如何解决?
问题是你在获取属性之前创建了Login()
的新实例:
// Code originally in the question
Login obj = new Login();
现在已经改为Login.GetInstance()
,但我们不知道该方法的作用。如果该方法每次都返回对Login
的新实例的引用,那么我们就会遇到同样的问题。
该对象中的两个属性都将为null,因为您尚未将它们设置为任何内容。 (所有引用类型的默认值都为null。)我不清楚您将属性设置为任何其他值,但是您设置它们的对象与您当时使用的对象不同在你向我们展示的最后一段代码中。
您需要确保可以在您调用“setter”的同一对象上使用“getters”。
顺便说一句,因为你的属性是微不足道的(它们只是获取和设置变量,没有其他行为,如验证),你可以用自动实现的属性替换你已经获得的所有第一段代码:
public string UserName { get; set; }
public string Password { get; set; }
你误解了我认为吸气者和二传手的工作方式。
在初始化对象时,所有未初始化的字段都设置为默认值(参考类型为null
,数字为0等)。
正如他们的名字所示,吸气剂和制定者可以设定价值和获取。
你正在做什么,初始化后你使用私有字段为各自的setter提供值。但它所做的是将提供给它的价值分配给下层领域。
因为你使用相同的私有字段,所以你永远不会初始化它,因为它是null
(正如我所提到的),然后你尝试通过setter设置它的值,但你传递的是null
,因此你最终得到了null
s 。
C#提供了一些称为属性的东西,因此您不需要私有字段。除非你想为getter和setter开发一些额外的逻辑。
正如其他用户所说,您正在创建一个新的Login实例,它自动将字段初始化为默认值(引用类型为null,数字为0)。
此外,您可以查看删除Login类的默认构造函数,并将以下内容作为构造函数:
public Login(string username, string password)
{
Username = username;
Password = password;
}
通过这样做,你可以做Login login = new Login("admin", "admin")
。
如果您只希望拥有一个Login类实例,也可以查看Singleton模式。