Is it possible to have a getter for a const?

僤鯓⒐⒋嵵緔 提交于 2019-12-29 07:55:52

问题


Just curious, is there a way to have a getter for a constant variable? I have a sort of internal version number to ensure that two versions of a library are still speaking the same language, but I'd like the programmer to be able to check what version they're using. Right now I use:

 private const Int16 protocol_version = 1;
 public Int16 ProtocolVersion { get { return protocol_version; } }

But I'd prefer to do it with just the const if there's a way.


回答1:


You could declare a property with only a get accessor (without even declaring the set accessor, not even private):

private const Int16 protocol_version = 1;
public Int16 ProtocolVersion { 
    get { return protocol_version; } 
}

This is not the same as defining a constant only: the constant would be resolved at compile time, so if you update the library without recompiling the dependent program, the program would still see the "old" value. Consider this example:

// The class library
using System;

namespace MyClassLibrary {
    public class X {
        public const Int16 protocol_version = 1;
        public Int16 ProtocolVersion { get { return protocol_version; } }
    }
}

// The program
using System;
using MyClassLibrary;

class Program {
    static void Main(string[] args) {
        X x = new X();
        Console.WriteLine("Constant : {0}", X.protocol_version);
        Console.WriteLine("Getter: {0}", x.ProtocolVersion);
    }
}

Now, compile the first time and execute the program. You will see

Constant : 1
Getter : 1

Then, modify protocol_version to 2, and recompile the class library only, without recompiling the program, then put the new class library in the program folder and execute it. You will see:

Constant : 1
Getter : 2

The fact is that if it's just a constant, the value is replaced at compile time.

I think that what you are actually looking for is a static readonly variable: in that way, you will avoid the compile-time const replacement, and the variable will not be modifiable after initialization:

public static readonly Int16 protocol_version = 1;



回答2:


You have to keep in mind the reason for the existance of getters/setters. It is to control access to an encapsulated variable, specifically to control how a variable is changed and who can change it. Since a const is set only once and remains read-only on runtime there is no reason to create a property for it. Setting the constant to public is completely acceptable since it is not a private variable that needs to be protected.

If you really... really want to make it a property then just define it as a readonly property, skip the setter entirely:

public Int16 ProtocolVersion { get { return protocol_version; } }

But just so we are clear, I would say normally you would have public constants with the same coding style as properties:

public const Int16 ProtocolVersion = 1



回答3:


Just do:

public const Int16 protocol_version = 1;

This will provide a public getter as a const cannot have a setter.




回答4:


Constants cannot be reassigned, hence why they are called constant therefore just make protocol_version public

private const Int16 protocol_version = 1;


来源:https://stackoverflow.com/questions/10362113/is-it-possible-to-have-a-getter-for-a-const

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!