你好,各位朋友。我的汽车产业有个小问题。一般来说,我对编程很陌生,我只开始学习类和对象。当我尝试使用自动属性时,该字段不会被公开。(不确定这是不是正确的说法)看看两个动物类中的Properties注释部分,来理解我在说什么。
现在我有个动物班
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);
}
}输出://Sarah出现在最后一行
Enter name:
bob
bob said WoWOW
Enter second name:
sarah
sarah said WoWOW我的问题是:为什么当使用auto属性时,我没有得到我想要的输出,但是当我完整地编写属性时,我确实得到了我想要的结果。谢谢你看我的问题。希望不是太长!]
发布于 2016-04-11 14:29:16
这将起作用:
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。
发布于 2016-04-11 14:29:49
好吧,这两个班级的成员并没有真正的联系。
private string name;
public string Name { get; set; }这里发生的是声明字段,以及自动属性,它自动创建基础字段并与第二个字段(而不是您创建的字段)一起工作。
您可以使用Auto的getter和setter,也可以显式地定义此方法(使用普通属性):
public string Name { get { return name; } set { name = value; } }automatically为您创建字段并自动实现上面的代码,从而节省您的时间。如果您想通过简单地设置(或获取)该字段的值来创建与其一起工作的字段和属性,那么自动属性就是一种方法。您只需定义自动属性并使用其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; }
}不要忘记属性的getter和setter方法与任何其他方法一样使用访问修饰符。默认情况下,这些访问器具有与属性相同的可见性或访问级别,但是有时您可能需要通过将访问修饰符更改为更受限的方法来封装该方法之一:
// setter of this property is only accessible inside the class or sub-classes
public string Name { get; protected set; } 发布于 2016-04-11 14:30:22
当您使用自动属性时
public string Name { get; set; }编译器不使用"name“作为支持字段。
相反,它用唯一的名称生成它自己的字段:
[CompilerGenerated]
private string <Name>k__BackingField;注意< and >,它们不是您可以在自己的字段名中使用的字符。在这种情况下,您不能直接访问备份字段。
https://stackoverflow.com/questions/36551540
复制相似问题