Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有性能或封装原因来创建专用变量以代替公共属性?_C#_Asp.net_Class_Properties - Fatal编程技术网

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声明属性
  • 不能指定初始值
  • 您不能为值的获取和设置添加更多逻辑
使用属性(而不是公共字段)的主要原因之一是,您可以在以后添加验证。如果你的大学养成了直接访问私人支持领域的习惯,那么当你添加一些验证时,你可能会感到头痛,而这些验证会被立即忽略。这可能是一个棘手的bug。

我不确定“你应该”这个问题是否属于SO。我想这应该属于程序员。stackexchange.com你从哪里听说这是个坏习惯?@Gabe,happy@约翰是一位同事。他没有一个很好的理由来解释为什么,所以问题就来了。@Chevex:为什么要关注一个没有理由的人呢?@John,因为他在回头看我,批评我的代码。现在我有很多不同的人给他看的东西。谢谢你快速简洁的回答。这就是我刚才所做的(询问它如何有害的例子),所以当我告诉他他错了时,我有一些参考。你们都很好地回答了我的问题。谢谢。@Cbevex:比这更直截了当:如果有人说你应该使用更复杂的代码,他们应该提供支持更改的具体论据。在一个完美的世界里,是的。但是,当他们碰巧在薪酬链上处于更高的位置时,不管是谁提出索赔,都可能陷入捍卫自己职位的不幸任务。