C#中的“const正确性”

常量正确性的要点是能够提供用户不能更改或删除的实例的视图。 编译器通过指出什么时候从const函数中断开constness或试图使用const对象的非const函数来支持这一点。 所以,如果不复制常量方法,是否有一种方法我可以在C#中使用,有相同的目的?

我意识到不可变性,但是这并没有真正转向容器对象,只是举了一个例子。

我也遇到过这个问题很多次,最后使用接口。

我认为放弃C#是任何forms,甚至是C ++的发展的想法是很重要的。 他们是两种不同的语言,几乎相同的语法。

我通常通过定义类的只读视图来在C#中表示“const正确性”:

 public interface IReadOnlyCustomer { String Name { get; } int Age { get; } } public class Customer : IReadOnlyCustomer { private string m_name; private int m_age; public string Name { get { return m_name; } set { m_name = value; } } public int Age { get { return m_age; } set { m_age = value; } } } 

为了得到const-craziness(或者在函数式编程术语中是纯粹的)的好处,你将需要以一种不变的方式devise你的类,就像C#的String类一样。

这种方法比仅仅将对象标记为只读方式更好,因为使用不可变类可以在多任务环境中轻松传递数据。

我只想告诉你,很多System.Collections.Generics容器都有一个AsReadOnly方法,它将返回一个不可变的集合。

C#没有这样的function。 您可以通过值或参考传递参数。 引用本身是不可变的,除非你指定ref修饰符。 但引用的数据不是不可变的。 所以你要小心,如果你想避免副作用。

MSDN:

传递参数

接口是答案,实际上比C ++中的“const”更强大。 const是对“const”被定义为“不设置成员或调用设置成员的东西”的问题的一种万能的解决scheme。 在许多情况下,这是一个很好的速记,但不是全部。 例如,考虑一个基于某些成员来计算值的函数,但也会caching结果。 在C ++中,这被认为是非const的,尽pipe从用户的angular度来看,它本质上是const。

接口为您提供更多的灵活性来定义您希望从class级提供的特定function子集。 想要恒常? 只需提供一个没有变异方法的接口。 想要设置一些东西,但不是其他人? 用这些方法提供一个接口。

同意其他一些人使用在构造函数中初始化的只读字段来创build不可变对象。

  public class Customer { private readonly string m_name; private readonly int m_age; public Customer(string name, int age) { m_name = name; m_age = age; } public string Name { get { return m_name; } } public int Age { get { return m_age; } } } 

另外,你也可以在属性上添加访问范围,即public get和protected set?

  public class Customer { private string m_name; private int m_age; protected Customer() {} public Customer(string name, int age) { m_name = name; m_age = age; } public string Name { get { return m_name; } protected set { m_name = value; } } public int Age { get { return m_age; } protected set { m_age = value; } } } 
  • const关键字可用于编译时间常量,如基元types和string
  • readonly关键字可用于运行时常量(如引用types)

readonly的问题是它只允许引用(指针)是常量。 引用的东西(指向)仍然可以修改。 这是棘手的部分,但没有办法绕过它。 实现常量对象意味着使它们不暴露任何可变的方法或属性,但这是尴尬的。

另请参阅有效的C#:50个具体方法来提高您的C# (第2项 – 更喜欢只读const)