题
点的常量的正确性是能够提供一个视的一个实例,这不可能修改或删除的用户。编译器,支持该指出,当你打破constness从内const功能,或试图使用一个非常量的函数的一个常数目的。因此,没有复制const的方法,是有一个方法我可以使用在C#具有同样结束?
我知道不可改变,但这并没有真正进行到容器的物体的名字,但一个例子。
解决方案
我也经常遇到这个问题并最终使用接口。
我认为重要的是放弃C#是任何形式的想法,甚至是C ++的演变。它们是两种语言几乎相同的不同语言。
我通常通过定义类的只读视图来表达C#中的'const correctness':
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(或函数式编程术语中的纯粹)的好处,你需要以一种方式设计你的类,使它们是不可变的,就像c#的String类一样。
这种方法比仅将对象标记为只读更好,因为使用不可变类,您可以在多任务环境中轻松传递数据。
我只想注意一下,许多System.Collections.Generics容器都有一个AsReadOnly方法,它会返回一个不可变的集合。
接口是答案,实际上比“const”更强大。在C ++中。 const是解决“const”问题的一种通用的解决方案。被定义为“不设置成员或调用设置成员的东西”。在许多情况下,这是常量的良好速记,但不是全部。例如,考虑一个函数,该函数根据某些成员计算值,但也会缓存结果。在C ++中,这被认为是非const的,尽管从用户的角度来看它基本上是const。
接口使您可以更灵活地定义要从类中提供的特定功能子集。想要保持稳定吗?只提供一个没有变异方法的接口。想要允许设置一些东西而不是其他东西吗?提供仅具有这些方法的界面。
同意其他一些人看看使用在构造函数中初始化的readonly字段来创建不可变对象。
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 关键词可用于编制时间常数等的原始种类型字符串
- 的 只读的 关键词可以用于运行时间常数,如参照类型
的问题 只读的 是,它只允许引用(指针)为恒定。这件事引用(指出)仍然可以进行修改。这是最棘手的部分,但没有办法解决它。要实现不断的对象装置使他们不让任何可变方法或性质,但是这个是尴尬的。
也参看 有效C#:50具体的方法来提高你的C# (项目2-喜欢读到const.)