繁体   English   中英

自动属性在c#中不起作用

[英]Auto properties is not working in c#

你好朋友。 我的自动属性有一个小问题。 我是一般的编程新手,我只是开始学习类和对象。 当我尝试使用自动属性时,该字段不会暴露。 (不确定这是不正确的放置方式)看看两个动物类中属性的注释部分,以了解我在说什么。

现在我有这个动物类

public class Animals
{
    //fields
    private string name;

    public Animals(string name)
    {
        this.name = name;
    }

    // default constructor
    public Animals()
    { }

    //This is the problematic portion
    public string Name { get; set; }


    public void Bark()
    {
        Console.WriteLine("{0} said WoWOW", name);
    }

}

这是我的主要课程

class Program
{
    static void Main(string[] args)
    {

        Console.WriteLine("Enter name: ");
        string name = Console.ReadLine();
        Animals dog = new Animals(name);
        dog.Bark();

        Animals cat = new Animals();
        Console.WriteLine("Enter second name: ");
        cat.Name = Console.ReadLine();
        cat.Bark();


    }
}

输出如下。 最后一行是我的问题

    Enter name:
    bob
    bob said WoWOW
    Enter second name:
    sarah
     said WoWOW //sarah is missing here

但是,当我将属性从{get; set}更改为类中的完整版本时。 它输出正确的输出。

编辑的代码

public class Animals
{
    //fields
    private string name;

    public Animals(string name)
    {
        this.name = name;
    }

    public Animals()
    { }

    //apparently this is the correct way of making properties
    public string Name
    {
        get { return name; }
        set { name = value; }
    }


    public void Bark()
    {
        Console.WriteLine("{0} said WoWOW", name);
    }

}

output: // Sarah出现在最后一行

    Enter name:
    bob
    bob said WoWOW
    Enter second name:
    sarah
    sarah said WoWOW

我的问题是:为什么在使用自动属性时我没有得到我想要的输出但是当我完全写出属性时,我确实得到了我想要的结果。 谢谢你看看我的问题。 希望它不会太久! ]

这将有效:

public class Animals
{
    //fields
    private string name; // <-- You don't need it when you have auto properties

    public Animals(string name)
    {
        Name = name;// <-- Using auto property
    }

    public string Name { get; set; }

    public void Bark()
    {
        Console.WriteLine("{0} said WoWOW", Name);//<-- Using auto property
    }

}

另外,您应该看看C#中的什么是自动属性,它们的用途是什么? 自动实现的属性(C#编程指南)


旁注1:如果没有其他构造函数,则无参数的空公共构造函数是无用的。 正如Joe指出的那样,如果在你的例子中你删除它,你将无法调用var a = new Animals();

旁注2:用一个单数名词命名你的类是很常见的,这里是Animal

那么,这两个班级的成员并没有真正联系起来。

private string name;

public string Name { get; set; }

这里发生的是你声明field和auto-property,它自动创建底层字段并使用第二个字段(不是你创建的字段)。

您可以使用Auto-Property的getter和setter,也可以显式定义此方法(使用普通属性):

public string Name { get { return name; } set { name = value; } }

Auto-Property创建字段并自动为您实现上述代码,从而节省您的时间。 如果您想通过简单地设置(或获取)该字段的值来创建与其一起使用的字段和属性,那么自动属性是一种方法。 你可以定义auto-property并使用它的get; set; 方法。 在某些情况下,您可能需要添加一些额外的逻辑(例如,您希望在保存之前验证属性内的值),然后唯一的选择是自己实现getter和setter方法:

public string Name 
{ 
   get { return name; }

   // sets field value depending on condition
   set { name = !string.IsNullOrEmpty(value) && value.Length < 20 ? value : name; } 
}

不要忘记该属性的gettersetter方法与任何其他方法一样使用访问修饰符。 默认情况下,这些访问者具有与属性相同的可见性或访问级别,但有时您可能需要通过将访问修饰符更改为更受限制来封装其中一种方法:

// setter of this property is only accessible inside the class or sub-classes
public string Name { get; protected set; } 

当您使用自动属性时

public string Name  { get; set; }

编译器不使用“name”作为支持字段。
相反,它会生成具有唯一名称的自己的字段:

[CompilerGenerated]
private string <Name>k__BackingField;

请注意<和>,它们不是您可以在自己的字段名称中使用的字符。 在这种情况下,您无法直接访问支持字段。

在您的代码中,您声明了自动属性Name但您从不使用它。 这就是您的代码所发生的事情:

这就是你的代码的工作方式

套管很重要, name指的是字段, Name指的是属性。 在这种情况下,它们是不同的东西。

使用自动属性时不需要声明字段,编译器会为您创建它们。

您应该在您的班级中将它们用作私人时声明字段,或者当您需要更精细的属性时。

因此,删除该字段并将构造函数更改为:

public Animals(string name)
{
    // property Name receives constructor parameter name
    Name = name;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM