不能在类实例中读取const

本文关键字:读取 const 实例 不能 | 更新日期: 2023-09-27 18:04:07

当编译器抱怨这个问题时,我有点惊讶:

public class UsefulClass
{
    public const String RatingName = @"Ratings'rating";
}
public class OtherClass
{
    public void SomeFunc()
    {
        UsefulClass useful = new UsefulClass();
        String rating = useful.RatingName;
    }
}

编译器说,"静态成员不能用实例引用访问;用类型名限定,而不是"

"

这不是问题,String rating = UsefulClass.RatingName;工作正常。我只是好奇这背后的想法是什么?我有一个带有公共常量的公共类的实例,为什么我不能以这种方式获取数据?

不能在类实例中读取const

因为常量不是实例成员;它们被静态地绑定到各自的类型。同样,你不能使用实例调用静态方法,你也不能使用实例访问类常量。

如果你需要在不知道一个实例的类型的情况下获得一个常量,我想你可以根据它的类型用反射来完成。

如果您试图添加一个不能修改但属于实例的成员,您可能需要只读字段或属性。

标记为const的"变量"是编译时构造,而不是实例成员。你可以像访问静态变量一样访问它:

public void SomeFunc()
{
    UsefulClass useful = new UsefulClass();
    String rating = UsefulClass.RatingName; // Access as if static
}

话虽这么说,我个人会把它包装成一个属性,如果它意味着使用你所描述的,像这样:

public class UsefulClass
{
    private const string ratingName = @"Ratings'rating";
    public string RatingName { get { return ratingName; } }
}

这将使你的语法工作,但也是一个更好的设计,在我看来,因为它不公开暴露你的常量。

因为c#中的const是隐式的静态类型。由于static成员只能在类成员上访问而不能在实例上访问,const也不能。