你好朋友。 我的自动属性有一个小问题。 我是一般的编程新手,我只是开始学习类和对象。当我尝试使用自动属性时,该字段不会暴露。 (不确定这是不是正确的方式) 在两个动物类中查看属性的注释部分,以了解我在谈论的内容。
现在我有这个动物类
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
我的问题是:为什么在使用自动属性时我没有得到我想要的输出但是当我完全写出属性时,我确实得到了我想要的结果。 谢谢你看看我的问题。希望它不会太久! ]
答案 0 :(得分:6)
这将有效:
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
}
}
另外,您应该查看What are Automatic Properties in C# and what is their purpose?和Auto-Implemented Properties (C# Programming Guide)
旁注1:如果你没有其他构造函数,那么一个空的,无参数的公共构造函数是没用的。正如乔指出的那样,如果您在示例中将其删除,则无法拨打var a = new Animals();
附注2:用一个单数名词命名你的类是很常见的,在这里Animal
。
答案 1 :(得分:4)
嗯,这两个班级的成员并没有真正联系。
private string name;
public string Name { get; set; }
这里发生的是你声明字段和auto-property,它自动创建底层字段并使用第二个字段(不是你创建的字段)。
您可以使用Auto-Property的getter和setter,也可以显式定义此方法(使用普通属性):
public string Name { get { return name; } set { name = value; } }
自动属性创建字段并自动为您实现上述代码,从而节省您的时间。如果您想通过简单地设置(或获取)该字段的值来创建与其一起使用的字段和属性,那么自动属性是一种方法。您可以定义自动属性并使用其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; }
答案 2 :(得分:3)
使用自动属性时
public string Name { get; set; }
编译器不使用“name”作为后备字段 相反,它会生成具有唯一名称的自己的字段:
[CompilerGenerated]
private string <Name>k__BackingField;
注意&lt;和&gt;,这些不是您可以在自己的字段名称中使用的字符。在这种情况下,您无法直接访问支持字段。
答案 3 :(得分:2)