const在C#中的用法

时间:2018-10-06 00:11:22

标签: c# oop const readonly-attribute

我想将下面的cert变量设为const?当我这样做时,我得到一个错误,“分配给cert的表达式必须是一个常量”。我在网上看到过一些文章要求将其转换为静态只读而不是const,并且还说要成为const,应在编译时知道其值。

我有两个问题

  1. 因为我没有,cert不可能成为const变量吗? 想要修改它?
  2. 我尝试将cert变量设置为只读,这也给了我 错误,“修饰符只读对此项目无效”。

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IAMAGoodDeveloper
{
    public class MyFactory
    {
        public KeyGen GenerateKeyProvider()
        {
            return new KeyGen();
        }
    }

    public class KeyGen
    {
        public int GetKey(string arg)
        {
            return 1;
        }
    }
}

MyFactory.cs

{{1}}

5 个答案:

答案 0 :(得分:2)

const是编译时关键字,它将用已编译代码中的硬编码值替换所有对您的const变量的引用

public class MyClass
{
    private const int MyNumber = 2;

    public void MyMethod()
    {
        Console.WriteLine(MyNumber);
    }
}

编译后,结果代码如下所示:

public class MyClass
{


    public void MyMethod()
    {
        Console.WriteLine(2);
    }
}

它将被编译为IL,但是您明白了。

这意味着您只能将在编译时已知且属于C#基本对象的东西标记为常量,例如字符串,整数,十进制等。

不幸的是,变量当前不允许

readonly。但是,有人在谈论使https://www.infoq.com/news/2017/04/CSharp-Readonly-Locals

成为可能

答案 1 :(得分:1)

  1. 您不能使用const。您可以认为const不太像变量,而更像是在编译时用值替换所有实例的宏。它只能与字符串和基元一起使用。

  2. 您只能将readonly与字段一起使用,而不能与局部变量一起使用。也许应该允许,但不允许。

答案 2 :(得分:1)

我明白了您为什么想要这样的东西,基本上等于JavaScript和TypeScript中的const或Kotlin中的val

A,C#没有此功能,不幸的是const不能那样工作。

您可以这样做:

namespace IAMAGoodDeveloper
{
    public static class Program
    {
        private static readonly int cert;

        static void Main(string[] args)
        {
            var myFactory = new MyFactory();
            var secretsProvider = myFactory.GenerateKeyProvider();
            cert = secretsProvider.GetKey("arg");
        }
    }
}

答案 3 :(得分:0)

  

执行此操作时,出现错误,“分配给cert的表达式必须为常量”。

忽略您想要的内容,并查看c#为 const 值提供的限制:const (C# Reference)

  

常量可以是数字,布尔值,字符串或空引用。

我不知道还能告诉您什么,您根本无法使用实例化的对象。

现在,创建一个稍微安全的 readonly 对象的另一种方法是只公开一个接口:

public class MyFactory
{
    public IKeyGen GenerateKeyProvider()
    {
        return new KeyGen();
    }

    public interface IKeyGen 
    {
      int GetKey(string arg);
    }

    private class KeyGen : IKeyGen
    {
        public int GetKey(string arg)
        {
            return 1;
        }
    }
}

由于您尚未包含此对象的任何用法,因此除了您不希望对象本身发生更改之外,很难确定其他任何内容。

答案 4 :(得分:0)

不能将const与实例化对象一起使用。 一个不错的选择是在类级别使用静态只读字段。