C#语法糖制作属性的方法是否存在内部差异:
public string FirstName { get; set; }
只是制作这样的公共变量:
public string LastName;
我认为第一种方式是首选,第二种方式是可以避免的。但是,我经常看到使用这种类型的只读属性,这是上面第二种类型的形式:
public readonly string InternalCode;
这是创建只读属性的最佳实践方法吗?
using System;
namespace TestProps
{
class Program
{
static void Main(string[] args)
{
Customer customer = new Customer();
customer.FirstName = "Jim";
customer.LastName = "Smith";
customer.Show();
}
}
class Customer
{
public string FirstName { get; set; } //prefered
public string LastName; //avoid
public readonly string InternalCode; //???
public Customer()
{
InternalCode = "234729834723984";
}
public void Show()
{
Console.WriteLine("{0}, {1} ({2})", LastName, FirstName, InternalCode);
Console.ReadLine();
}
}
}
答案 0 :(得分:17)
由于他还没有回答(还没有)其他人没有提到这一点:Jon Skeet在这个主题上有一篇很棒的文章,修改了他的书 C#in depth (给Jon的信用) :
答案 1 :(得分:3)
使用属性提供了一个更能抵抗未来变化的界面。让我们说未来的某个时间,决定在内部代码中添加前缀。
使用公共只读变量会暴露您的内部结构,并且您很难将前缀添加到您使用类的内部变量的每一行。
使用Property,您可以编写以下内容
public string InternalCode {
get { return _prefix + _internalCode; }
}
你已经完成了!
答案 2 :(得分:3)
在我看来,暴露公共字段是可以的(特别是如果它们是readonly或const)。话虽如此,我会说你在演示的例子中,我可能会选择属性,因为它们会给你2个优势(超过字段):1)更好的封装,可以让你调整你的代码未来和2)如果您正在进行数据绑定,那么您确实需要这些属性。
答案 3 :(得分:1)
是。有一个公共只读变量是可以的(只是它们可以在定义或构造函数时初始化)。
e.g。 Decimal.MaxValue
如果支持值发生变化(除了初始化的内容之外),拥有公共只读属性是好的。
e.g。 Environment.TickCount
我认为Environment.NewLine将是一个公共只读变量。嗯,这是一个公共财产(仅限获取),原因可能是维持不同平台的兼容性。
答案 4 :(得分:0)
简短的回答:公共 const 是好的,公共只读不一定,公共得到没有设置不必要。 没有分配就无法更改的对象可以。参考类型很危险,因为您仍然可以更改其值,即使您无法更改参考本身。
readonly关键字的问题在于它并不意味着您理解为逻辑只读/不可变的内容。它意味着更像“只能在构造函数中分配”。引用不能更改,但其值可以。遗憾的是,c#没有提供“真正的”只读关键字。另请参阅https://blogs.msdn.microsoft.com/ericlippert/2007/11/13/immutability-in-c-part-one-kinds-of-immutability/
属性不能包含readonly关键字(https://titombo.wordpress.com/2012/11/11/using-the-c-modifiers/)。 正如其他人所指出的,您可以使用属性并仅定义get和no set,但您无法在构造函数中设置该属性。使用私有集,您可以在类中设置 annywhere 的属性,仅在构造函数中设置 not 。 readonly字段会有一点限制性。