我想使用带有自动属性的干净且编码较少的类。所有物业都是公共的。在同一个类中的方法内部,我也使用了这些属性。因此,我认为这种方法是可混合的,因为我使用公共属性进行内部使用和公共使用。对于像这样的情况,最好的方法是什么?在方法中使用私有成员并为公共使用创建属性或在类中使用public(或某些特殊情况私有)属性?
public class Account
{
public int Count {get; set;}
private int Calculate()
{
return Count * Count;
}
}
或使用类似的东西
public class Account
{
private int _count;
public int Count {
get
{
return _count;
}
set
{
_count = value,
}
}
private int Calculate()
{
return _count * _count;
}
}
答案 0 :(得分:2)
第一种方式非常好,因为它实际上是你用第二种方式写的。但是,当您需要向getter或setter添加其他代码时要小心。
答案 1 :(得分:2)
在内部和外部使用公共属性是完全可以接受的,特别是如果它是自动属性,因为您的属性中没有逻辑。我认为这是首选的方法,因为它是更清晰的代码。
BTW:编译代码时会创建一个支持字段,因此两个示例的IL代码是相同的。因此,自动属性只是设计时开发人员可用性功能。
自动属性getter的IL代码......
.method public hidebysig specialname instance int32
get_Count() cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 11 (0xb)
.maxstack 1
.locals init (int32 V_0)
IL_0000: ldarg.0
IL_0001: ldfld int32 ConsoleApplication1.Program::'<Count>k__BackingField'
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
} // end of method Program::get_Count
带有支持字段的属性getter的IL代码...
.method public hidebysig specialname instance int32
get_Count() cil managed
{
// Code size 12 (0xc)
.maxstack 1
.locals init ([0] int32 CS$1$0000)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldfld int32 ConsoleApplication1.Program::_count
IL_0007: stloc.0
IL_0008: br.s IL_000a
IL_000a: ldloc.0
IL_000b: ret
} // end of method Program::get_Count
答案 2 :(得分:2)
我认为第一种方法更可取。您正在公开一个概念,而不是一个简单的变量,这意味着您可以在以后轻松更改该概念的定义,而无需更改消费代码。
事实上,我希望有一种方法可以使字段只能访问需要它们的属性,以明确避免第二种情况。
答案 3 :(得分:0)
这里看不到问题,我的意思是在内部使用public
属性。
众所周知,属性在字段方面引入了一些非常小的开销,但在99.99%
情况下,它是无关紧要的,所以我认为这不重要。
简而言之,第一种情况还可以。
在TDD设计方面也考虑到这一点。如果您要测试public
成员(根据TDD的最佳实践),您也可以测试对“内部”功能的影响。
答案 4 :(得分:0)
Getters和Setters被高度重用。 我已经看到数百万人声称公共领域是邪恶的,所以他们将它们变成私人的,并为所有人提供吸气剂和制定者。我相信这几乎与使字段公开相同,如果您使用线程(但通常不是这种情况)或者您的访问者具有业务/表示逻辑(至少是“奇怪的”),可能会有所不同。我并不赞成公共领域,而是反对为他们每个人制作一个getter / setter(或Property),然后声称这样做是封装或信息隐藏......哈! 作者:Pablo Fernandez ref: this and 19 other controversial programming opinions
为了解决这个问题,我使用了两个,第一个选项是最简单的。当在属性getter / setter中出现一些副作用时,问题有点难以回答。一个典型的例子是当引发事件以指示属性已更改时。这是否可以在课堂内和外部请求中发生?在这种情况下,使用属性而不是支持变量将提供一致的行为。所以最好的答案取决于: - )