【问题标题】:Constant class variable in c# [duplicate]c#中的常量类变量[重复]
【发布时间】:2021-08-30 12:30:01
【问题描述】:

我想在我的类中声明一个变量,以后不能像这样更改:

obj myobj=new obj()
myobj.CONSTANT_VAR="Changed value" //ERROR!!

...但是可以像这样访问其值:

Console.WriteLine(myobj.CONSTANT_VAR)

我尝试了以下方法:

public class obj{
    public int a, b;
    public const string CONSTANT_VAR;
    public obj(int x,int y){
        a=x;
        b=y;
        CONSTANT_VAR=1/(a*((""+a).Length)+3/(b*((""+b).Length)).ToString();
    }
    public int do(){
        return this.a+this.b-(CONSTANT_VAR).Length;
    }
}
class DriverClass(){
    static void Main(){
        obj myObj=new obj(2,3);
        myObj.a=34;
        myObj.b=35;
        myObj.CONSTANT_VAR="changed ur string lol"; //i want it to print error
      
        Console.WriteLine(CONSTANT_VAR); //no error
        Console.WriteLine(myObj.add());
    }
}

但我却收到以下错误消息:

constants must have a value assigned

但我不想事先给它赋值..... 我该怎么办?

【问题讨论】:

  • 如果您发布的代码除了您面临的问题之外有效,这将非常有帮助 - 您的类声明一开始就无效。遵循命名约定也很重要,即使只是示例代码。
  • 首先,你的代码不应该编译,因为你不能在类名中使用“()”。然后消息已经告诉您: "constants must have a value assigned" ,而您没有:public const string CONSTANT_VAR; - 必须立即分配。如果你不能这样做,你就不能使用const。您可以使用的是public readonly 字段。可以在ctor中分配。
  • 在某人更改a 和/或b(如在您的Main 方法中)之后,CONSTANT_VAR 是否应该反映该更改或保持obj 实例构建时的状态?
  • 对我犯的愚蠢错误感到抱歉,因为我刚刚从 python 之类的语言迁移到 c#

标签: c# class constants


【解决方案1】:

您正在寻找只读字段或属性,不是 const 用于真正的全局常量。

我建议完全避免使用公共字段,而是使用属性 - 因此在这种情况下,您需要一个仅获取属性。遵循 .NET 命名约定,您将拥有如下内容:

public class Obj
{
    public int A { get; set; }
    public int B { get; set; }

    public string ConstantVar { get; }

    public Obj(int x, int y)
    {
        A = x;
        B = y;
        ConstantVar = /* complex expression */
    }

    public int Do() => A + B - ConstantVar.Length;
}

【讨论】:

  • OP:请注意,Obj 仍然是一个非常糟糕的类名选择。
  • @Fildor:当然。而且Do 仍然是一个非常糟糕的方法名称选择。
  • 无关:请注意,在此示例中 AB 有设置器,这意味着您可能需要在它们更改时重新计算 ConstantVar
  • @Fildor:我认为原始代码中的 ab 可以更改,但它听起来就像 OP 希望 ConstantVar保持原样。哦,模棱两可的问题带来的乐趣:(
  • 很公平,我认为应该足以给 OP 基本概念。只是想明确指出。
【解决方案2】:

您可以使用 Readonly,它让您可以选择设置一次值,以后不能更改。

public class obj(){
    public int a, b;
    public readonly string CONSTANT_VAR;
    public obj(int x,int y){
        a=x;
        b=y;
        CONSTANT_VAR=1/(a*((""+a).Length)+3/(b*((""+b).Length)).ToString();
    }
    public int do(){
        return this.a+this.b-(CONSTANT_VAR).Length;
    }
}
class DriverClass(){
    static void Main(){
        obj myObj=new obj(2,3);
        myObj.a=34;
        myObj.b=35;
        myObj.CONSTANT_VAR="changed ur string lol"; //i want it to print error
      
        Console.WriteLine(CONSTANT_VAR); //no error
        Console.WriteLine(myObj.add());
    }
}

【讨论】:

  • 这也有效,所以我赞成它...................... ................................
猜你喜欢
  • 2011-08-27
  • 2017-04-20
  • 2020-12-20
  • 2018-12-10
  • 2019-04-07
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
相关资源
最近更新 更多