Is it possible to have a getter for a const?

前端 未结 4 1955
忘掉有多难
忘掉有多难 2020-12-19 06:16

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 t

相关标签:
4条回答
  • 2020-12-19 07:05

    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
    
    0 讨论(0)
  • 2020-12-19 07:08

    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;
    
    0 讨论(0)
  • 2020-12-19 07:12

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

    private const Int16 protocol_version = 1;
    
    0 讨论(0)
  • 2020-12-19 07:19

    Just do:

    public const Int16 protocol_version = 1;
    

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

    0 讨论(0)
提交回复
热议问题