不能在类实例中读取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
的"变量"是编译时构造,而不是实例成员。你可以像访问静态变量一样访问它:
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也不能。