首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动属性在c#中不起作用

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

Stack Overflow用户
提问于 2016-04-11 14:26:47
回答 4查看 2.4K关注 0票数 6

你好,各位朋友。我的汽车产业有个小问题。一般来说,我对编程很陌生,我只开始学习类和对象。当我尝试使用自动属性时,该字段不会被公开。(不确定这是不是正确的说法)看看两个动物类中的Properties注释部分,来理解我在说什么。

现在我有个动物班

代码语言:javascript
复制
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);
    }

}

这是我的主程序课

代码语言:javascript
复制
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();


    }
}

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

代码语言:javascript
复制
    Enter name:
    bob
    bob said WoWOW
    Enter second name:
    sarah
     said WoWOW //sarah is missing here

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

编辑代码

代码语言:javascript
复制
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);
    }

}

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

代码语言:javascript
复制
    Enter name:
    bob
    bob said WoWOW
    Enter second name:
    sarah
    sarah said WoWOW

我的问题是:为什么当使用auto属性时,我没有得到我想要的输出,但是当我完整地编写属性时,我确实得到了我想要的结果。谢谢你看我的问题。希望不是太长!]

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-11 14:29:16

这将起作用:

代码语言:javascript
复制
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:如果没有其他构造函数,则空的、无参数的公共构造函数是无用的。正如乔所指出的,如果在您的示例中删除它,您将无法调用var a = new Animals();

边注2:用单数名词命名类是非常常见的,这里是Animal

票数 6
EN

Stack Overflow用户

发布于 2016-04-11 14:29:49

好吧,这两个班级的成员并没有真正的联系。

代码语言:javascript
复制
private string name;

public string Name { get; set; }

这里发生的是声明字段,以及自动属性,它自动创建基础字段并与第二个字段(而不是您创建的字段)一起工作。

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

代码语言:javascript
复制
public string Name { get { return name; } set { name = value; } }

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

代码语言:javascript
复制
public string Name 
{ 
   get { return name; }

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

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

代码语言:javascript
复制
// setter of this property is only accessible inside the class or sub-classes
public string Name { get; protected set; } 
票数 3
EN

Stack Overflow用户

发布于 2016-04-11 14:30:22

当您使用自动属性时

代码语言:javascript
复制
public string Name  { get; set; }

编译器不使用"name“作为支持字段。

相反,它用唯一的名称生成它自己的字段:

代码语言:javascript
复制
[CompilerGenerated]
private string <Name>k__BackingField;

注意< and >,它们不是您可以在自己的字段名中使用的字符。在这种情况下,您不能直接访问备份字段。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36551540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档