【问题标题】:Getting Value Through C# Getter Setter Property Returns Null通过 C# Getter Setter 属性获取值返回 Null
【发布时间】:2018-09-04 05:45:30
【问题描述】:

我有一个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_ 都是strings。现在我有另一个Usercontrol,我在MainWindow 中通过按钮点击访问它,如下所示。

<vm:ViewUsers x:Name="ViewAllUsers" Visibility="Hidden"/>

我在 UserControl 后面的代码中所做的是如下访问 UsernamePasswordProperty Getter Setter 的值,如下所示。

string username = Login.GetInstance().UserName;
string password = Login.GetInstance().Password;

在调试 obj.UserName; 属性时返回 Null。为什么它返回 null,我应该如何解决这个问题?

【问题讨论】:

  • 您从未真正将 Username_ 的值设置为 anyting。在你的课堂上试试Username_ = "foo";
  • 如果返回值为 null,则支持字段的值 null 在调用 get-accessor 时.. start有了这个前提并向后工作:什么使它成为现实?为什么支持字段[仍然]为空?根据需要使用调试器来逐步执行和测试假设(并更新不正确的假设)。
  • 您的属性未映射到任何用户控件,也未在代码中设置值

标签: c# null setter getter


【解决方案1】:

问题是您在获取属性之前创建了Login() 的新实例:

// Code originally in the question
Login obj = new Login();

现在已更改为Login.GetInstance(),但我们不知道该方法的作用。如果 that 方法每次都返回对 Login 新实例的引用,那么我们就会遇到同样的问题。

该对象中的两个属性为空,因为您尚未将它们设置为任何值。 (所有引用类型的默认值为 null。)我不清楚您将属性设置为任何其他值的位置,但无论您设置它们的哪个对象都与您当时使用的对象不同在您向我们展示的最后一段代码中。

您需要确保可以在您调用“setter”的同一对象上使用“getter”。

顺便说一句,因为您的属性是微不足道的(它们只是获取和设置变量,没有其他行为,例如验证),您可以替换 all 的第一段代码获得了自动实现的属性:

public string UserName { get; set; }
public string Password { get; set; }

【讨论】:

  • 好吧,我已经将属性设置为 Username = "Admin" 和 Password = "Admin" 并调用了 Login.GetInstance().UserName;但它仍然返回 Null。
  • @asim.ali314:在哪里你设置了这些属性?你把它们放在哪个物体上? Login.GetInstance() 是什么? (您还没有向我们展示。)无论返回什么引用,new Login() 都会创建一个具有自己属性的单独的、独立的实例。
  • 请参考我已经做了一些更改并编辑了现有问题的问题。由于我是 C# 新手,所以如果可能的话,我需要一些代码 sn-ps 的详细示例。
  • @asim.ali314:我们仍然不知道Login.GetInstance() 做了什么。我知道目前这些答案可能没有太大帮助,但 Stack Overflow 并不是学习语言基础知识的好方法,甚至提供代码来解决眼前的问题可能对未来没有太大帮助工作。我强烈建议您获取一本好的 C# 书籍并认真阅读。了解类型系统的工作原理非常重要——什么是对象、引用类型和值类型之间的区别等。
  • @asim.ali314:我认为使用控制台应用程序而不是 GUI 来学习很多早期概念更容易,因为您可以用更少的代码编写整个程序,没有在 GUI 中经常发生的大量背景“魔法”。
【解决方案2】:

我认为你误解了 getter 和 setter 的工作原理。

在初始化对象时,所有未初始化的字段都设置为默认值(null 用于引用类型,0 用于数字等)。

Getter 和 setter,顾名思义,用于设置价值和获取。

你在做什么,初始化后你使用私有字段为各自的设置器提供值。但它所做的是将提供给它的值分配给底层字段。

由于您使用的是相同的私有字段,因此您永远不会初始化它,因为它是null(正如我提到的),然后您尝试通过 setter 设置它的值,但是您传递的内容是 null,因此你最终也会得到nulls。

而 C# 提供了一些称为属性的东西,因此您不需要私有字段。除非你想为 getter 和 setter 开发一些额外的逻辑。

【讨论】:

    【解决方案3】:

    正如其他用户所说,您正在创建一个新的 Login 实例,它会自动将字段初始化为默认值(引用类型为 null,数字为 0)。

    此外,您可以查看删除 Login 类的默认构造函数,并将以下内容作为构造函数:

    public Login(string username, string password)
    {
        Username = username;
        Password = password;
    }
    

    通过这样做,您可以执行Login login = new Login("admin", "admin")

    如果您只想拥有一个 Login 类的实例,也可以查看 Singleton 模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多