Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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#_Properties - Fatal编程技术网

C#受保护的财产或场地

C#受保护的财产或场地,c#,properties,C#,Properties,您认为最好始终将受保护的类成员设置为自动实现的受保护属性以保持隔离,还是将其设置为受保护的字段就足够了 protected bool test { get; set; } 或 通常,您应该使用AutoProperty—这使您可以轻松添加验证或以后需要的任何其他内容。如果受保护的成员将由程序集外部的类使用,这一点尤其重要,因为添加此类代码不会破坏与它们的约定,而将字段更改为方法或属性则会破坏它们。属性由私有字段支持 可能有用建议的做法是使其成为属性。签名的更改取决于它是字段还是属性,如果跨越程序

您认为最好始终将受保护的类成员设置为自动实现的受保护属性以保持隔离,还是将其设置为受保护的字段就足够了

protected bool test { get; set; }


通常,您应该使用AutoProperty—这使您可以轻松添加验证或以后需要的任何其他内容。如果受保护的成员将由程序集外部的类使用,这一点尤其重要,因为添加此类代码不会破坏与它们的约定,而将字段更改为方法或属性则会破坏它们。属性由私有字段支持


可能有用

建议的做法是使其成为属性。签名的更改取决于它是字段还是属性,如果跨越程序集,这可能会导致问题。如果你一开始就把它作为一种财产,你就永远不会有这个问题。(通常在以后读取或写入属性时需要添加逻辑。)

在C#中,自动实现属性非常简单,没有理由不这样做


而且,它使事情变得更加清楚。如果它真的被外部世界用作对象功能的一部分,则将其作为属性。否则,未来的程序员可能会怀疑您是否意外地将字段设置为受保护而非私有。

您不应该允许从类外部直接访问成员变量。使用自动生成的属性或带有支持字段的属性。如果您允许直接访问,当多个方法更改派生链中的值,而您不知道是哪个方法导致了错误时,可能会导致一些非常糟糕的调试问题。

我知道这个问题很老,但我会根据值的范围以及需要初始化或写入的位置来回答它。我尽量使用最窄的范围。希望以下内容将更清楚地说明如何作出决定:

受保护的值:这假设值只需要基类和/或继承类访问,而不需要任何外部代码访问

  • 当继承类必须读取但不必修改值时:

    • 如果该值可以在基类的构造函数中写入一次,请使用以下命令,以防止继承类写入该值,并进一步操作,只允许在构造函数中设置该值:

      受保护只读布尔测试

    • 如果可以在构造函数以外的其他方法中写入值,但仍然只能在基类中写入,请使用以下方法,以防止继承类写入该值,但允许其读取:

      受保护布尔测试{get;private set;}

  • 当继承类可以修改该值时,请使用以下命令,该命令允许继承类和基类在任意点写入该值:

    protectedbool测试

  • 私有值:这假设只需要从声明该值的类中访问该值

  • 如果只能在构造函数中设置一次,请使用:

    只读布尔测试

  • 如果可以在类中的任何位置设置,请使用:

    bool检验


  • 另外,不要忘记,如果您将它声明为属性,它应该使用PascalCase。如果将其声明为成员变量,则应使用camelCase。这将使其他开发人员更容易理解范围。

    与受保护字段相比,它的实际优势是什么?对一个字段进行封装,以及在访问调试器时中断调试器的功能也使其非常有用。一个优势是能够使用例如INotifyPropertyChanged来执行属性更改通知。通常,这种方法(由私有字段支持的受保护属性)促进了封装,即信息隐藏。除非有充分的理由,否则不要透露实现。(我假设问题集中在受保护的属性上,因为其中涉及到一些继承。)坦率地说,在我自己的代码中,我不希望在公开受保护的值时继承类,但这确实是现实的。虽然我的直接反应是将它包装在一个财产中,但受保护的关系已经相当亲密了,所以我想知道包装它在这里能给你带来多少好处。我想我会同意包装,但我必须承认在这里有复杂的感觉。@StevenSudit:公开对基地拥有的可变对象的引用怎么样?如果可继承的集合公开了受保护的列表内容,则
    contents.Add(someNewItem)
    的语义比
    contents
    作为属性公开时要清晰得多。公开数据存储限制了未来基类版本更好地使用某些东西的能力,但可能允许派生类做许多有用的事情,否则这些事情将是不可能或不切实际的。作为自动属性的暴露是两个世界中最糟糕的,因为它基本上会告诉那些编写派生类的人…使用自动属性如何使添加验证变得容易?您可以稍后将自动属性更改为普通属性,并添加任何您想要的代码,使用dll的用户不必重新编译即可使用更新的程序集。
    protected bool test;