【发布时间】:2012-11-29 18:59:14
【问题描述】:
使用有什么区别
public string Username { get; set; }
并使用
public string Username;
我一直在使用第一个,但想了解两者之间是否有任何区别,以及一个人应该优先于另一个的场景。
【问题讨论】:
-
这不是“类声明”而是属性/字段声明。
标签: c#
使用有什么区别
public string Username { get; set; }
并使用
public string Username;
我一直在使用第一个,但想了解两者之间是否有任何区别,以及一个人应该优先于另一个的场景。
【问题讨论】:
标签: c#
public string Username { get; set; }
同时
public string Username;
更多比较,
其他链接
【讨论】:
你可以用属性做的一件事是你不能用字段做的就是限制 setter 或 getter 的可见性:
public string MyProperty { get; private set; }
我经常使用的东西。
你不能用字段做的事情(更强大的)是在接口中定义它们。假设您想要一个需要实现类的接口具有特定属性:
public interface MyInterface
{
string MyProperty { get; }
}
请注意,这里不需要设置器。完全由实现类来确定它们应该如何设置 MyProperty。
【讨论】:
这是一个非常小的示例,说明您可以使用字符串属性而不是简单地使用字符串。
假设你有一个私有变量叫做:
private string _name;
现在假设您想让该字符串只读?换句话说,您无法更改该值。您可以使用以下内容:
public string Name
{
get { return _name; }
}
它可以让您控制对该值的访问。或者,您可以拥有它,以便该变量只能写入执行以下操作:
public string Name
{
set { _name = value; }
}
现在,如果你把它放在一起,它将允许你设置值或简单地获取值。请参阅以下内容:
public string Name
{
get { return _name; }
set { _name = value; }
}
您可能想知道这样做的意义何在,因为看起来您可以使用常规字符串执行相同的操作,当然,但这控制了从非派生自 said 的外部类对 _name 变量的直接访问类。
现在,如果您想控制该值的设置方式,该怎么办?如果您想进行一些计算,或者您想为该值添加前缀或后缀怎么办?您执行以下操作:
public string Name
{
get
{
return _name;
}
set
{
if (value.ToLower() == "bilbo")
_name = "Bilbo Baggins";
}
}
现在,如果您将类的 Name 属性设置为 bilbo,_name 的值将设置为 Bilbo Baggins,而不是将属性设置为 Amy,_name 变量将仅包含 amy。
您可以这样做以保证属性设置的任何值都自动为大写或小写,或者您可以对值或类似的东西进行一些验证。
我希望这能解释属性的用途,以及它们如何有用而又不会使其过于复杂。
【讨论】:
属性为您提供了更大的灵活性,尤其是在 .NET 中。 C# 显示出对属性的偏见,因此请记住这一点。但是,作为一般规则,在获取或设置需要“处理”或伴随操作时使用访问器/修改器。使用字段来保存值。例如,
public class Name
{
public string First;
public string Last;
public string Full{ get { return this.First + " " + this.Last; } }
}
【讨论】: