[英]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; }
}
不要忘记该属性的getter
和setter
方法与任何其他方法一样使用访问修饰符。 默认情况下,这些访问者具有与属性相同的可见性或访问级别,但有时您可能需要通过将访问修饰符更改为更受限制来封装其中一种方法:
// 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;
请注意<和>,它们不是您可以在自己的字段名称中使用的字符。 在这种情况下,您无法直接访问支持字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.