点的常量的正确性是能够提供一个视的一个实例,这不可能修改或删除的用户。编译器,支持该指出,当你打破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方法,它会返回一个不可变的集合。

C#没有这样的功能。您可以按值或引用传递参数。除非您指定 ref 修饰符。但引用的数据不是一成不变的。所以如果你想避免副作用,你需要小心。

MSDN:

传递参数

接口是答案,实际上比“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.)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top