gpt4 book ai didi

c# - 有一个与类(class)同名的成员是不是不好的风格?

转载 作者:行者123 更新时间:2023-11-30 16:24:24 25 4
gpt4 key购买 nike

假设我有 class Foo

class FooFrobber
{
private Foo _foo;

FooFrobber(Foo foo)
{
_foo = foo;
}

Frob()
{
_foo.FrobCount += 1;
}
}

_foo 似乎是 private 字段的好名称,但是如果我想将其设为 internal protected 变量?约定(http://weblogs.asp.net/lhunt/archive/2004/08/17/CSharpCodingStandardsv113.aspx 通过 Style guide for c#? )似乎是使用没有 m_ 或尾随 _ 的 StudlyCaps,这意味着我将声明 protected Foo Foo。这似乎可行,但隐藏类名似乎有点奇怪。风格指南说所有字段都应该是私有(private)的,但这似乎有点过分(但也许这是我内心的 python 说话)。无论如何,如果我们想将 _foo 包装在属性中,您似乎会遇到同样的问题。

我是否应该像在 MyFoo 中一样为该字段起一个不同的名称?是否可以保留原样,因为编译器似乎并不介意?

最佳答案

拥有与其类型共享相同名称的字段/属性是允许的和常见的做法。从 FCL 想到的第一个例子是 DispatcherObject.Dispatcher , 它返回一个 Dispatcher 类型的实例.

但是,我个人更喜欢避免将字段声明为 protected ,而是使用属性。如果您想避免与声明支持字段相关的编码,您可以使用自动实现的属性:

protected Foo Foo { get; set; }

使用属性的优点是您可以为 getter 和 setter 应用不同的访问修饰符:

protected Foo Foo { get; private set; }

编辑:使用 protected 属性而不是 protected 字段的优势在于,它们允许您更改其实现——例如,引入值验证或更改通知——而无需破坏可能访问的外部库

例如,假设您想扩展您的类以实现 INotifyPropertyChanged。如果您使用 protected 字段,则没有直接的方法来检测字段的值何时被使用程序集更改(除非您也更改外部程序集的实现)。如果您使用的是 protected 属性,则可以简单地更改其实现,而无需对使用程序集进行任何更改:

private Foo foo;

protected Foo Foo
{
get
{
return foo;
}
set
{
if (foo != value)
{
foo = value;
OnPropertyChanged("Foo");
}
}
}

编辑2:在LBushkin’s answer 中给出了在字段上使用属性的更多优势。 .

将字段更改为属性似乎会破坏 ABI。我还没有在权威来源中找到它(我没有花太多时间寻找);然而,根据 pst’s comment :

The code behind the property can be changed (to use a custom private backing field or whatever). However, changing a Public Member Variable to a Property is a breaking change in the ABI (Application Binary Interface).

根据 jstedfast’s answer :

First thing to keep in mind is that property accessors are compiled into methods. This means that it has a different ABI from just reading/writing to a class member variable, even though it may syntactically look the same.

关于c# - 有一个与类(class)同名的成员是不是不好的风格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10902889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com