C# 是否有性能或封装原因来创建专用变量以代替公共属性?
假设我有一个带有公共属性的类,用于属性注入,如下所示:C# 是否有性能或封装原因来创建专用变量以代替公共属性?,c#,asp.net,class,properties,C#,Asp.net,Class,Properties,假设我有一个带有公共属性的类,用于属性注入,如下所示: public partial class ManageFoo : PageBase { [Inject] public IFoo Foo { get; set; } public void SomeMethod() { this.Foo.Bar(); } } public partial class ManageFoo : PageBase { [Inject] p
public partial class ManageFoo : PageBase
{
[Inject]
public IFoo Foo { get; set; }
public void SomeMethod()
{
this.Foo.Bar();
}
}
public partial class ManageFoo : PageBase
{
[Inject]
public IFoo Foo
{
get { return _foo; }
set { _foo = value; }
}
private IFoo _foo;
public void SomeMethod()
{
_foo.Bar();
}
}
我们的IoC容器处理将IFoo
的实例注入属性的操作。如您所见,属性Foo
使用缩写{get;set;}
来定义属性。然而,我听说在整个课程中使用公共属性是一种不好的做法,我应该有一个附带的私有变量,如下所示:
public partial class ManageFoo : PageBase
{
[Inject]
public IFoo Foo { get; set; }
public void SomeMethod()
{
this.Foo.Bar();
}
}
public partial class ManageFoo : PageBase
{
[Inject]
public IFoo Foo
{
get { return _foo; }
set { _foo = value; }
}
private IFoo _foo;
public void SomeMethod()
{
_foo.Bar();
}
}
我听到了不同的意见,但我还没有听到一些具体的原因,为什么一个比另一个好。是首选较短的语法还是首选私有变量?为什么?我认为{get;set;}是编译器为您创建的支持私有变量的语法糖。实际上,调用公共属性以任何方式访问该私有变量
现在,如果公共属性是可重写的,并且您关心封装,那么我当然可以理解为什么您可能想要定义和使用自己的私有属性。但一般来说,我认为这并不重要,我更喜欢调用属性。私有变量不会在代码中添加任何值,因为它是多余的。为这两个对象生成的IL是等效的,除了您的方法调用,该方法调用现在依赖于私有成员并通过属性getter
最好的代码是没有代码或至少更少的代码。使用自动实现的属性和使用显式表单之间没有显著区别。是的,您的类的代码将全部通过属性-这几乎肯定会被JIT内联
自动实现的属性为您提供了更少的代码,而且更清晰——去做吧。下次有人告诉你在声明公共属性的类中引用公共属性是一种不好的做法时,请询问具体的例子,说明它是如何有害的:)我只是太懒了,不想在没有必要的时候添加私有属性
我想它符合您为应用程序设置的标准,因为它最终都是一样的。如果您使用ILDASM查看C#被“编译”时生成的中间语言,您将看到
public IFoo Foo { get; set; }
使C#编译器为您创建保持私有变量
如果只有通过酒店才能访问Foo,则无需添加私人占位符。但是,如果任何其他属性或方法可以更改obj.Foo的结果,那么就需要一个私有变量 进一步说,引用类中的私有支持字段会使修改类本身更加困难。例如,假设您希望setter执行一些操作,而不仅仅是设置支持字段(例如,引发事件)。或者您决定在get上使用某种类型的延迟计算。如果您的实现始终引用支持字段,那么进行这些修改比实现始终引用公共属性要困难得多
当引入自动实现的属性时,我做了一些测试,看看性能是否有任何差异。没有。访问自动实现的属性的执行速度与访问以旧方式实现的属性的备份字段的速度一样快。我的结论是:尽可能使用自动实现的属性,因为它的代码更少,更容易修改,并且没有性能损失。使用自动实现的属性时有一些限制:
- 不能仅用get或set声明属性李>
- 不能指定初始值李>
- 您不能为值的获取和设置添加更多逻辑李>