C#中的适当变量声明

时间:2009-01-09 06:11:30

标签: c# asp.net

我注意到有些人声明了一个私有变量,然后是一个带有get和set语句的公共变量:

private string myvariable = string.Empty;
public string MyVariable
{
    get { return myvariable; }
    set { myvariable = value ?? string.Empty; }
}

然后有些人会做以下事情:

public string MyVariable
{
    get { return value; }
    set { MyVariable = value; }
}

做一个没有智慧的熊(是的,我有孩子......你为什么问?)我无法弄清楚为什么你会选择一个而不是另一个。使用公共变量是否同样有效,您可以使用变量的set方法随时设置?

有人能为我解释一下吗?

更新:在几个人指出它无法编译之后,我更正了第二个例子。对此抱歉,但问题仍然存在......

4 个答案:

答案 0 :(得分:19)

您的第二个示例将无法编译,因为getter的值变量不存在。此外,setter会导致同名的StackOverflow异常!

在C#3.0中,您可以使用以下语法让编译器创建私有后备变量:

public string MyVariable { get; set; }

但是,这不会给你第一个例子的额外空值检查。如果您需要在setter中使用自定义逻辑,则可能必须坚持使用第一个示例的方法。

答案 1 :(得分:6)

正如其他人所说,你的第二个例子没有编译。

但是,不使用公共领域有很好的理由。实际上,您的示例演示了其中一个 - 对于此属性,即使您将其设置为null,如果再次请求它,也会返回一个空字符串。是否适合该属性(它的略微奇数)取决于确切的用途 - 但这不是公共领域的行为。

我有一个whole article关于为什么属性比公共字段更好,你可能会发现它们很有用。

答案 2 :(得分:1)

This是关于这个主题的非常有趣的读物。但是,我很确定我已经在MSDN上的某处读过,公共变量的对象比具有属性的对象要轻(找不到链接)。

答案 3 :(得分:-1)

使用普通的getter和setter与使用公共字段非常相似。

优先选择使用属性的getter和setter的主要参数是uniform access principle,但由于C#具有属性,因此很容易用属性替换公共字段并重新编译。

这并不完美(参见Jon Skeet的文章),但是反对使用公共领域的论据不是那么强烈,只要你意识到差异就会使它变得“邪恶”。

就个人而言,我希望能够轻松指定公共字段的默认值。