我一直在研究C#属性,对于一些建议的示例(例如Microsoft's)所获得的收益,我有些困惑。
他们的类属性示例如下:
public class SaleItem
{
string name;
decimal cost;
public SaleItem(string name, decimal cost)
{
this.name = name;
this.cost = cost;
}
public string Name
{
get => name;
set => name = value;
}
public decimal Price
{
get => cost;
set => cost = value;
}
}
在声明类属性(例如:
)时,他们的示例给您带来了什么?public class SaleItem
{
public string Name { get; set; };
public decimal Cost { get; set; };
public SaleItem(string name, decimal cost)
{
Name = name;
Cost = cost;
}
}
我认为this
和=>
的使用使我失望,因为我不太熟悉它们,但是我通常不理解这两个示例之间的区别,或者为什么您可以选择一个。
很抱歉,如果这是一个过于笼统的话题,但是任何人都可以澄清一下,也许可以将我指向一些有用的资源,我们将不胜感激。
答案 0 :(得分:0)
this
关键字用于该类的当前实例。通过这种方法,您可以从构造函数,实例方法和实例访问器内部访问成员。
this
关键字用于引用实例。然后可以调用Ans来执行与该实例相关的一些计算。
通过使用自动实现的属性,您可以简化代码,同时让C#编译器透明地为您提供支持字段。
public string Name { get; set; };
public decimal Cost { get; set; }
可以使用简单的lambda语法编写属性,而不必编写完整的正文
public string Name
{
get => name;
set => name = value;
}
增加了表达体以改善属性声明。现在可以将主体定义为lambda表达式,而不是语句块。语法很容易使用=>
。
答案 1 :(得分:0)
在示例1中,您实际上只需花费很少的精力就可以编写出属性。示例2是自动实施。
我通常更喜欢自动执行属性(案例2)。实际上,实现任何逻辑对我来说都是次要的。我通常使用Proeprties,而自动实现是写它们的最短方法。如今,我完全避免使用字段。
在情况1中我看不到任何优势。这可能是他们展示一些新机制的方式。不用全部花括号就可以编写出属性代码的方法。看起来像Lambda,但其他人却没有。
如果我有什么需要批评的话1.属性的最大危险之一是不小心使用类代码中的后备字段。那永远不会发生。而且,将背景字段设为小写是不是避免这种情况的可行方法。确实,Micrsoft自己的标准是开始使用下划线“ _”来支持字段,因此不会出现混淆。
“名称”和“名称”?容易混淆。我不记得我多久键入一次快速字符,并且无法识别大写的起始字母。
“ _ Name”和“ Name”?如果您愿意,很难混合在一起并立即显示出来。
答案 2 :(得分:-2)
第一组项目使用的是称为表达式绑定成员的较新语法,该语法使您可以以简洁的格式编写表达式。尽管使用了相似的语法,但不要将它们与Lambda表达式混淆(谢谢gunr2171)!
public string Name
{
get => name; // exactly the same as "get { return name; }"
set => name = value; // exactly the same as "set { name = value; }"
}
第二组是在大多数面向对象的语言中发现的经典“ getters”和“ setters”。
'this'关键字对于对象来说是特殊的。您可以使用'this'关键字来访问您的实例化对象的属性,方法和其他元素,尽管您的IDE / Compiler会自动推断出它们,所以您无需编写
this.Name
并且可以改写
名称
在逻辑上是等效的。唯一不能使用'this'关键字的时间是在访问类的静态属性和方法时,这些属性和方法属于该类而不是对象本身。
以上两个示例在逻辑上是等效的,只是以不同的方式编写。理解lambda表达式很重要,但是我认为在这种情况下,Microsoft只是向您展示了可能的方法,在我的经验中,“ getter”和“ setter”模式更为常见(您的团队可能会喜欢使用此语法作为好吧!)