如果是只读的,可以在C#中使用公共变量吗?

时间:2009-04-21 08:14:46

标签: c# properties

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();
        }
    }
}

5 个答案:

答案 0 :(得分:17)

由于他还没有回答(还没有)其他人没有提到这一点:Jon Skeet在这个主题上有一篇很棒的文章,修改了他的书 C#in depth (给Jon的信用) :

  

Why Properties Matter

答案 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字段会有一点限制性。