无法在类实例中读取const?
当编译器抱怨这个时,我有点意外:
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;
工作良好。 我只是好奇这背后的想法是什么? 我有一个带有公共常量的公共类的实例,为什么我不能以这种方式获取数据?
因为常量不是实例成员; 他们与各自的类型有着静态的联系。 以同样的方式,您无法使用实例调用静态方法,您无法使用实例访问类常量。
如果您需要在不知道第一手类型的情况下获得实例的常量,我想您可以根据其类型使用reflection来实现。
如果您尝试添加无法修改但与实例相关的成员,则可能需要只读字段或属性。
标记为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; } } }
这将使您的语法工作,但也是一个更好的设计,IMO,因为它不公开暴露您的常量。
因为c#中的const隐式是静态类型。 并且由于静态成员只能在类成员上访问而不能在实例上访问,因此const也不能访问。